1. Collection Type
2. String
3. Sort
4. Type
5. Casting
6. Iterator
7. Graph
8. Advanced Operator
9. Pow, Sqrt, Radix
10. Regex
-
기본
/* 선언 */ var dict = [String: Int]() /* 할당 */ dict["A"] = 0 /* 키에 대한 기본값을 0으로 주고 특정 문자열이 나올 때마다 +1 */ for str in ["a","b","c"] { dict[str, default: 0] += 1 } print(dict) // ["a": 1, "b": 1, "c": 1] /* 꺼내기 */ let value = dict["A"] ?? 0 // key가 없는 경우, nil을 리턴하기 때문에 ??으로 처리. /* 특정 value 기준 key 꺼내기 */ let dict = [1:2, 2:2, 3:4] var answer = [Int]() for (k, v) in dict { if v == 2 { answer.append(k) } } print(answer) // [1, 2]
-
응용
/* 선언된 키에 번호 매기기 */ let fruit = ["apple", "banana", "melon"] let dict = Dictionary(uniqueKeysWithValues: zip(fruit, 0..<3)) // ["apple": 0, "banana": 1, "melon": 2] /* 번호 키에 모든 값 0으로 할당 */ let dict = Dictionary(uniqueKeysWithValues: zip(0..<3, Array(repeating: 0, count: 3))) // [0: 0, 1: 1, 2: 2] /* 키에 값을 array로 그룹핑 */ let dict = Dictionary(grouping: fruit) { $0 } // ["apple": ["apple"], "banana": ["banana"], "melon": ["melon"]]
-
Hour to Second
import Foundation func hToSecond(_ h: String) -> Int { let split = h.components(separatedBy: ":") let h = (Int(split[0]) ?? 0) * 60 * 60 let m = (Int(split[1]) ?? 0) * 60 let s = (Int(split[2]) ?? 0) return h + m + s } print(hToSecond("1:01:06")) // 3666
-
String -> String Array
let name = "Seungmin" let nameArray = name.map { String($0) } // 각 요소를 String으로 형변환하지 않으면 Character 타입이 됨 print(nameArray) // ["S","e","u","n","g","m","i","n"]
-
String Array -> String
let nameArray = ["S","e","u","n","g","m","i","n"] let name = nameArray.joined() print(name) // Seungmin 또는 let name = nameArray.reduce("", +) print(name) // Seungmin
-
String Array -> String 띄어쓰기 적용
let array = ["a", "b", "c"] print(array.joined(separator: " ")) // a b c
-
문자열을 다른 문자열로 바꾸기
import Foundation var fruit = "bananaApple" fruit = fruit.replacingOccurrences(of: "banana", with: "pine") print(fruit) // pineApple
-
모든 문자열이 특정 문자열인지 확인하기
var allA = "AAAAAA" if allA.allSatisfy({ $0 == "A" }) { print("All A!") // All A! }
-
String Array -> Two Dimensional String Array
let stringArray = ["010", "0001", "0101"] var array = stringArray.map { $0.map { String($0) } } print(array) // [["0","1","0"], ["0","0","0","1"], ["0","1","0","1"]]
-
Two Dimensional String Array -> String
let array = [["0","1","0"], ["0","0","0","1"], ["0","1","0","1"]] print(array.map { $0.joined() }.joined()) // 01000010101
-
문자열 반복
let str = "Hi!" let strs = String(repeating: str, count: 5) print(strs) // Hi!Hi!Hi!Hi!Hi!
-
문자열이 알파벳인지 판별하는 변수 isAlpha 구현
extension String { var isAlpha: Bool { self.rangeOfCharacter(from: CharacterSet.letters.inverted) == nil } 또는 var isAlpha: Bool { guard let value = Character(self).asciiValue else { return false } if (value >= 65 && value <= 90) || (value >= 97 && value <= 122) { return true } else { return false } } } let letter = "%" print(letter.isAlpha) // false
-
첫 번째 문자열을 대문자로 변경하는 변수 firstCharUppercase 구현
extension StringProtocol { var firstCharUppercase: String { guard let first = first else { return "" } return String(first).uppercased() + dropFirst() } } let word = "hello!" print(word.firstCharUppercase) // Hello!
-
문자열 indexing, start(with:), hasPrefix() 추가 예정
-
1차원 배열
var array: [Int] = [5, 3, 1, 4] /* 오름차순 */ array.sort() array.sort(by: <) array.sort{ $0 < $1 }
-
2차원 배열
var array: [[Int]] = [[5, 1], [2, 4], [3, 5], [3, 2]] /* 배열의 두 번째 인덱스 값을 기준으로 내림차순 정렬 */ array.sort { $0[1] > $1[1] } /* 배열의 첫 번째 인덱스 값 오름차순 정렬 후, 같은 값은 두 번째 인덱스 값 내림차순 정렬 */ array.sort { ($0[0], $1[1]) < ($1[0], $0[1]) }
-
Typealias
// typealias로 모델을 생성하면 객체를 생성할 때, 파라미터 이름을 쓰지 않아도 됨. // 그러나 .0 .1로 접근해야하기 때문에 가독성이 떨어짐. typealias Point = (Int, Int) let point = Point(0, 0) print(point.0, point.1) // 0, 0
-
Struct
// init에 argument label을 '_'로 줘서 typealias처럼 사용할 수 있음 // 그러나 구현 시간이 typealias보다 오래 걸림 struct Point { let i: Int let j: Int init(_ i: Int, _ j: Int) { self.i = i self.j = j } } let point = Point(0, 0) print(point.i, point.j) // 0 0
-
Character -> Int
let str = "a" let intValue = Character(str).asciiValue!
-
Character -> Int
let n = 65 let stringValue = Character(UnicodeScalar(n)!)
-
문자열 합쳐서 출력
let stringArray : [[String]] = [["a","b","c"], ["d","e","f"]] for string in stringArray { print(string.joined()) } // abc // def
-
두 시퀀스 반복 - zip 활용
let firstSequence = [1,2,3] let SecondSequence = [4,5,6] var result = 0 for v in zip(firstSequence, SecondSequence) { let (first, second) = v result += first * second } print(result) // 32
-
시퀀스의 특정 인덱스의 값만 추출
// names 문자열 시퀀스에서 앞에서부터 5의 배수 번 째의 이름을 추출하고 싶을 때 let names = ["nami", "ahri", "jayce", "garen", "ivern", "vex", "jinx"] print(stride(from: 0, to: names.count, by: 5).map { names[$0] }) // ["nami", "vex"]
- 두 노드의 연결을 띄어쓰기로 주어졌을 때
/* 양방향 기준 */ let n = Int(readLine()!)! var g = Array(repeating: [Int](), count: n + 1) for _ in 0..<n! { let adj = readLine()!.split(separator: " ").map{Int($0)!} g[adj[0]].append(adj[1]) g[adj[1]].append(adj[0]) }
-
NOT Operator(~)
let value = ~0b00001111 // 11110000, -16
-
AND Operator(&)
let value = 0b00001100 & 00000111 // 00000100, 4
-
OR Operator(|)
let value = 0b00001100 | 00000111 // 00001111, 15
-
XOR Operator(^)
let value = 0b00001111 ^ 0b00001101 // 00000010, 2
-
pow
import Foundation // Foundataion을 꼭 import 해야함 // 연산하는 타입은 모두 Double이라는 걸 명심! let value: double = 100.0 print(pow(value, 2.0)) // 10000.0
-
sqrt
let value: double = 100.0 print(sqrt(value, 2.0)) // 10.0
-
10진수 -> 3진수
var a = 45 print(String(a, radix: 3)) // 1200
-
3진수 -> 10진수
var a = "1200" print(Int(a, radix: 3) ?? 0) // 45
-
2진수에서의 1의 개수
let n = 11 // 1011 print(n.nonzeroBitCount) // 3
- 문자열에서 특정 문자열 삭제
var string = "nice to meet you".replacingOccurrences(of: "[aeiou]", with: "", options: .regularExpression) // 모음 제거 print(string) // nc t mt y