[Collection Types]
Array(Ordered)
var someInts: [Int] = []
// var someIntss: [[Int]] = Array(repeating:Array(repeating:0, count:5), count:5)// 5x5
// var someIntss: [[Int]] = Array(repeating:[Int](), count:5)// 5x5
// String을 제외하고는, subscript로 접근 가능
var arr = [[1,2,3],[2,3],[4]]
var flattenInts = arr.flatMap {$0} // 2차원 -> 1차원으로 병합 // return optional
// Swift 4.1 부터 -> flatMap {$0} .compactMap {$0} // Optional binding & remove nil
flattenInts.min()//max() Comparable 프로토콜을 따르는 1차원 배열에서만 가능
var slicedInts = flattenInts[0..1].map{Int($0)}
// slicing return -> Array<Int>.subSequence -> Array<Int>로 변환(map)
let reducedInts = arr.reduce([], +) // 초기값 설정 후 그 위에 병합
let joindedInts = Array(arr.joined()) // 병합
// All three above show the same result.
let sortedArr = arr.sorted(by: <)
print(arr.filter {$0 == 1})
someInts.append(3)
someInts = [] // empty
if someInts.isEmpty {}
// sorted/sort, first,last
var anotherInts = Array(repeating: 0, count: 3)
var newArr = someInts + anotherInts
newArr += [1]
for i in 1..<newArr.count {}
let intBool: Bool = someInts.contains { (number: Int) -> Bool in
return number > 10
}
var shoppingList: [String] = ["Eggs", "Milk", "Flour"]
shoppingList[1..<3] = ["Bananas", "Apples"] // replace
shoppingList.insert("Maple Syrup", at: 0) // append
let mapleSyrup = shoppingList.remove(at: 0)
shoppingList.removeLast()
for (index, value) in shoppingList.enumerated() { print("Item \(index + 1): \(value)") }
for i in shoppingList.indices.reversed() { print(i) }
// Subscript extension에 정의(range를 return) => []으로 개별 접근 가능
let a = "abcd"
str[str.startIndex..<str.index(str.startIndex, offsetBy: 4)] // str[0..<4]
print(b.subString(start: 1, end: b.count))
var exPrefix = a.prefix(2) // 머리
var exSuffix = a.suffix(1) // 꼬리
let secondIndex = string.index(after: string.startIndex)
let second = string[secondIndex]
let endIndex = string.index(before: str.endIndex)
// Example: let index = string.index(string.startIndex, offsetBy: n-1)
// str[offsetBy 부분]
"abc".firstIndex(of: "c") // c 를 값으로 갖고 있는 index 중 첫 번째 //lastIndex(of :)
"aaabb".replacingOccurences(of:"a", with:"b") // Foundation Framework needed!
str.startIndex
str.endIndex
str.index(str.startIndex, offsetBy:2)
str.index(after: idx)
str.index(before: idx)
str.firstIndex(of: "s")
str.endIndex(of: "r")
str.range(of: "str")
Set(Unordered/No duplicates) [집합]
a.hashvalue == b.hashvalue [Hashable: Default Data Type & Enumeration case]
var letters = Set<Character>()
letters.insert("a")
letters.isEmpty // False
letters.remove("a")
letters.contains("a") // True
print(letters.contains{$0 == "a"})
letters = []
var genre: Set<String> = ["Rock", "Classical", "Hip hop"]
// var genre: Set = ["Rock", "Classical", "Hip hop"]
for g in genre.sorted() {}
- intersaction
- symmetricDifference
- union
- substracting // A->B
let oddDigits: Set = [1, 3, 5, 7, 9]
let evenDigits: Set = [0, 2, 4, 6, 8]
let singleDigitPrimeNumbers: Set = [2, 3, 5, 7]
oddDigits.union(evenDigits).sorted() // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
oddDigits.intersection(evenDigits).sorted()// []
oddDigits.subtracting(singleDigitPrimeNumbers).sorted() // [1, 9] oddDigits.symmetricDifference(singleDigitPrimeNumbers).sorted() // [1, 2, 9]
isSubset(of:)/isSuperset(of:)
? isStrictSubset/isStrictSuperset // 진부분집합
isDisjoint(with:)
let houseAnimals: Set = ["🐶", "🐱"]
let farmAnimals: Set = ["🐮", "🐔", "🐑", "🐶", "🐱"]
let cityAnimals: Set = ["🐦", "🐭"] houseAnimals.isSubset(of: farmAnimals) // true
farmAnimals.isSuperset(of: houseAnimals) // true
farmAnimals.isDisjoint(with: cityAnimals) // true
Dictionary(Unordered/key-value<Optional>)
-Sorted() Needed (Time Complexity = 상수)
var namesOfIntegers = [Int: String]()
var namesOfIntegers: Dictionary<Int, String> = [:]
// var namesOfIntegers: [Int: String] = [:]
var airports = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]
airports.updateValue("Dublin Airport", forKey: "DUB")
airports[DUB] = Dublin Airport
airports[DUB] = nil
airports.removeValue(forKey: "DUB")
for (airportCode, airportName) in airports {}
for airportName in airports.keys {}
for airportName in airports.values {}
airports.forEach { print($0.key + " " + $0.value) }
let beverage = ["latte", "americano"]
var dic = [String: String]()
beverage.forEach { dic[$0, default: "Basic"] += " Coffee" }
Higher Order Functions
- 결과적으로, For문 내부적 시행(코드 간소화, But 시간복잡도 Same)
1. Map
// 개별 요소에 접근 후, 맵핑(형태 변환)
let string = ["1", "2", "3", "4", "5"]
let numbers = string.map { Int($0)! }
let multipliedArray: [Int] = numbers.map { $0 * 9 }
let strings = numbers.map({ (number: Int) -> String in
return "\(number)"
})
2. Filter
// 값을 걸러서, 추출
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
let evenNumbers = numbers.filter { $0 % 2 == 0 }
let sports = ["Climbing", "Running", "Fishing", "Swimming", "Skiing"]
let sixLetterSports: [String] = sports.filter { $0.count == 6 }
let evenNumbers: [Int] = numbers.filter { (number: Int) -> Bool in
return number % 2 == 0
}
//후행 클로저
let oddNumbers: [Int] = numbers.filter { $0 % 2 != 0 }
3. Reduce
// Integrate inner contents
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
let sum = numbers.reduce(0, +)
let sum = numbers.reduce(0) { $0 + $1 }
// 초깃값 == 0
var subtract: Int = someNumbers.reduce(0, { (first: Int, second: Int) -> Int in
return first - second
})
4. Zip
let numbers = [1, 2, 3, 4, 5]
let strings = ["One", "Two", "Three", "Four", "Five"]
let zipped = zip(numbers, strings)
for (number, string) in zipped {
print("\(number) is \(string)")
}
//return a sequence of tuples(,)
+ Useful functions
let nums = readLine()!.split(seperator:" ") // ["1", "2", "3", "4"] Array<String>
let anotherStrs = "abcd".split(separator: "b") // ["a"], ["c", "d"]
// Using map, SubSequence -> String
let nums = readLine()!.components(seperatedBy:" ") // ["1", "2", "3", "4"] Array<Substring>
// Can be split into substrings
let str = "I have enough moneny"
str.split(separator: " ", maxSplits: 2) // 최대 2번만 쪼개기
str.split(separator: " ", omittingEmptySubsequences: false) // 띄어쓰기 빼주기 False(==넣어주기)
for even in stride (from:2, to: 100, by: 2) {}
for even in stride (from:2, through: 100, by: 2) {} // to - 1
repeat~while // do~while
abs // absolute value()
radix // 진수변환: String(someInt, radix:3) or Int(someStr, radix: 3) // 반대로
round, ceil, floor, trunc
pow(a, b) // a의 b승
lowercased()/uppercased()/capitalized()
타입변환 () // is or type(of:)
Right ~= Left 연산자 // 'Right' belong to 'Left' // -> Bool
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss" // any format
+) To be continued with 'Closure'
https://yagom.github.io/swift_basic/contents/22_higher_order_function/
https://velog.io/@un1945/Swift-%EA%B3%A0%EC%B0%A8%ED%95%A8%EC%88%98-Higher-order-Function
https://lena-chamna.netlify.app/post/useful_methods_for_algorithm/
https://m.blog.naver.com/tksrl0379/221972280764
https://velog.io/@folw159/Swift-components%EC%99%80-split%EC%9D%98-%EC%B0%A8%EC%9D%B4
'📱 iOS Programming > Frameworks & Libraries' 카테고리의 다른 글
Dispatch Queue (Concurrency Control) (0) | 2024.05.13 |
---|