Swift๋ก ๋ฌธ์์ด ๋ฌธ์ ๋ฅผ ํ๋ค๋ณด๋ฉด ์ค๋ฅ๋ฅผ ์์ฃผ ์ ํ๊ฒ ๋๋ค.
(error: cannot convert value of type 'String.Element' (aka 'Character') to closure result type 'String)
'์ด๊ฒ ์ ์๋จ? ใ ใ ' ๋ผ๋ ์๊ฐ์ด ๋ค ์ ๋๋ก ์๋๋ค.
์๋ฌดํผ ์ด๋ฐ ์ค๋ฅ๋ฅผ ์์ฃผ ์ ํ๊ธฐ์ ๊ธ๋ก ์ ๋ฆฌํ๋ฉด์ ๋ค์ ํ ๋ฒ ๋ณต์ตํ๋ ค๊ณ ํ๋ค.
1. ๋ฌธ์์ด ํ ๋ณํํ๊ธฐ
1. String -> Int
๋ค๋ฅธ ์ธ์ด์์์ฒ๋ผ Int()๋ก ํ ๋ณํ์ ์งํํ๋ค.
์ด ๋, String์ธ์ง SubString์ธ์ง Character์ธ์ง ์ ์ดํด๋ณธ๋ค.
(๊ทธ๋ ์ง ์์ผ๋ฉด... error: cannot convert value of type 'String.Element' (aka 'Character') to closure result type 'String')
var a: String = "1"
var b: Substring = "2"
var c: Character = "3"
print(Int(a)) // Optional(1)
print(Int(b)) // Optional(2)
print(Int(c)) // Error!
2. Int -> String
var a: Int = 1
print(String(a)) // 1
3. ๋ค๋ฅธ ๊ธฐ๋ณธ ํ์ ๋ค
String -> Int ์ ๋์ผํ๋ค.
String๊ณผ Character, Optional์ ์ฃผ์ํ๋ค.
2. ๋ฌธ์์ด์ ํ ๊ฐ์ฉ ๋ถ๋ฆฌํ๊ธฐ
ํ๋์ ๋ฌธ์์ด์ ํ๋์ ๋ฌธ์๋ก ๋๋ ์ผํ ๋๋ map์ ์ฌ์ฉํ๋ค. ๋ฐํ ๊ฐ์ด [Character] ํ์ ์ด๋ฏ๋ก ์ฃผ์ํ๋ค.
var s: String = "abcdefg"
var characters: [Character] = s.map { $0 } // [Character]
var strings: [String] = s.map { String($0) } // [String]
3. ๋ฌธ์์ด์ ํน์ ๋ฌธ์๋ฅผ ๊ธฐ์ค์ผ๋ก ๋๋๊ธฐ
๋ฌธ์์ด์ ๊ณต๋ฐฑ์ด๋ ๊ธฐํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋๋ ๋๋ split์ด๋ components๋ฅผ ์ฌ์ฉํ๋ค.
1. split
๋ฐํ ๊ฒฐ๊ณผ๊ฐ [SubString] ํ์ ์ด๋ฏ๋ก [String] ํ์ ์ด ํ์ํ ๊ฒฝ์ฐ ํ ๋ณํ์ ํด์ค๋ค.
var s: String = "a b c d e f g" // ๊ณต๋ฐฑ์ด ์กด์ฌ
var subStrings: [SubString] = s.split(separator: " ").map { $0 } // [SubString]
var strings: [String] = s.split(separator: " ").map { String($0) } // [String]
2. components
๋น์ทํ๊ฒ components๊ฐ ์๊ณ , Foundation import๋ฅผ ํตํด ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ๋ฐํ ๊ฐ์ด [String] ํ์ ์ด๋ค.
import Foundation
var s: String = "a b c d e f g" // ๊ณต๋ฐฑ์ด ์กด์ฌ
var strings: [String] = s.components(separatedBy: " ")
4. ๋ฌธ์์ด ๋ด ํน์ ๋ฌธ์ ํฌํจ ์ฌ๋ถ
1. contains
var s: String = "kodo"
var a: String = "k"
var b: Character = "k"
var c: Substring = "k"
print(s.contains(a)) // true
print(s.contains(b)) // true
print(s.contains(c)) // true
2. hasPrefix
์์์๋ถํฐ ๋ฌธ์์ด์ ๋น๊ตํ๋ค.
hasPrefix ๋ฉ์๋์ ๋๊ฒจ์ฃผ๋ ์ธ์๋ String ํ์ ์ด์ด์ผ ํ๋ค.
var s: String = "kodo"
var a: String = "k"
var b: Character = "k"
print(s.hasPrefix(a)) // true
print(s.hasPrefix(b)) // Error!
3. hasSuffix
hasPrefix์ ๋ฐ๋๋ก ๋ค์์๋ถํฐ ๋ฌธ์์ด์ ๋น๊ตํ๋ค.
var s: String = "kodo"
var a: String = "k"
var b: Character = "k"
print(s.hasSuffix(a)) // false
print(s.hasSuffix(b)) // Error!
var c: String = "o"
var d: String = "do"
var e: String = "odo"
var f: String = "kod"
print(s.hasSuffix(c)) // true
print(s.hasSuffix(d)) // true
print(s.hasSuffix(e)) // true
print(s.hasSuffix(f)) // false
5. ๋ฌธ์์ด ๋ด ํน์ ์์น, ๋ฌธ์ ๋ฐํ
1. startIndex, endIndex
Swift์์๋ ๋ฌธ์์ด์ ์ธ๋ฑ์ค๋ก ์ง์ ์ ์ผ๋ก ์ ๊ทผํ ์ ์๋ค.
String[index]๊ฐ ๋ถ๊ฐ๋ฅํ๊ณ , String[String.index]๋ก ์ ๊ทผํ ์ ์๋ค.
startIndex๋ ๋ฌธ์์ด์ ์ฒซ ์ธ๋ฑ์ค๋ฅผ, endIndex๋ ๋ฌธ์์ด์ ๋ง์ง๋ง ์ธ๋ฑ์ค + 1์ ๋ฐํํ๋ค.
var s: String = "kodo"
var start: String.Index = s.startIndex
var end: String.Index = s.endIndex
print(s[0]) // Error!
print(s[start]) // k
print(s[end]) // Error!
์ด๋ฅผ ํ์ฉํด์ ๋ฌธ์์ด ํ์ฑ์ด ๊ฐ๋ฅํ๋ค.
var s: String = "kodo"
var start: String.Index = s.startIndex
var end: String.Index = s.endIndex
print(s[start..<end - 1]) // kodo
print(s[start...) // kodo
2. firstIndex
firstIndex ๋ฉ์๋์ ๋๊ฒจ์ฃผ๋ ์ธ์๊ฐ ์ฒ์ ๋ฑ์ฅํ๋ ์ธ๋ฑ์ค๋ฅผ ๋ฐํํ๋ค.
์ธ์๋ Character ํ์ ์ด๊ณ , ๋ฐํ ๊ฐ์ด ์์ ์๋ ์๊ธฐ์ ํด๋น ๋ฉ์๋์ ๋ฐํ ํ์ ์ Optional์ด๋ค.
var s: String = "kodo"
var e1: String = "o"
var index: String.Index? = s.firstIndex(of: e1) // Error!
var e2: Character = "o"
var index: String.Index? = s.firstIndex(of: e2) // Optional(...)
3. index
ํน์ ์ธ๋ฑ์ค ์ด์ , ์ดํ์ ์ธ๋ฑ์ค์ ์ ๊ทผํ ์ ์๋ค.
after์ ๊ฒฝ์ฐ after ์ดํ์ ์ธ๋ฑ์ค๋ฅผ, before์ ๊ฒฝ์ฐ before ์ด์ ์ ์ธ๋ฑ์ค๋ฅผ ๋ฐํํ๋ค.
var s: String = "kodo"
var start = s.startIndex // 0
var end = s.endIndex // 4
print(s[s.index(after: start)]) // s[1] = o
print(s[s.index(start, offsetBy: 0)]) // s[0] = k
print(s[s.index(start, offsetBy: 1)]) // s[1] = o
print(s[end]) // Out of Bounds
print(s[s.index(before: end)]) // s[3] = o
print(s[s.index(end, offsetBy: -1)]) s[3] = o
6. ์์คํค์ฝ๋ ๋ณํํ๊ธฐ
๋ฌธ์๋ฅผ ์์คํค์ฝ๋๋ก ๋ณํํ๊ฑฐ๋, ์์คํค์ฝ๋๋ฅผ ๋ฌธ์๋ก ๋ณํํ ๋๋ UnicodeScalar๋ฅผ ์ฌ์ฉํ๋ค.
1. String -> ASCII
์์คํค์ฝ๋๋ก ๋ณํํ ๋๋ UnicodeScalar์ ๋๊ฒจ์ฃผ๋ ์ธ์๊ฐ String ํ์ ์ด์ด์ผ ํ๋ค.
๋ํ ๋ณํ ๊ฒฐ๊ณผ๊ฐ Optional์ด๋ฏ๋ก ๊ฐ์ ์ธ๋ํ์ ์งํํ๋ค.
var s: String = "kodo"
var stringToAscii: [Int] = s.map { UnicodeScalar($0)?.value } // Error!
var stringToAscii: [Int] = s.map { UnicodeScalar(String($0))?.value } // Error!
var stringToAscii: [UInt32] = s.map { UnicodeScalar(String($0))!.value } // 107 ...
var stringToAscii: [Int] = s.map { Int(UnicodeScalar(String($0))!.value) } // 107 ...
2. ASCII -> String
์ญ์ UnicodeScalar์ ๊ฒฐ๊ณผ๊ฐ Optional์ด๋ฏ๋ก ๊ฐ์ ์ธ๋ํ์ ์งํํ๋ค.
var asciis: [Int] = [107, 111, 100, 111]
var asciiToString = asciis.map { String(UnicodeScalar($0)!) }.joined() // joined๋ก ๋ฌธ์์ด ๋ณํ
7. ๋ฌธ์์ด ๋ค์ง๊ธฐ
Collections ํ์ ์ reversed๋ฅผ ํ์ฉํ๋ค.
var s: String = "kodo"
print(s.map { String($0) }.reversed().joined()) // "odok"