본문 바로가기

📱 iOS Programming/Frameworks & Libraries

[Swift] Collection Types & Higher Order Functions

[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