210423 Fri
→関数を他の関数の伝達因子として使用できる
1.最初の学習内容:マッピング(Map)
→従ってマッピングは常に既存データの変換(変換)に用いられる
Q.なぜ地図を書くのですか?
構文
import Foundation
let numbers: [Int] = [0, 1, 2, 3, 4]
var doubledNumbers: [Int] = [Int]()
var strings: [String] = [String]()
for number in numbers {
doubledNumbers.append(number * 2)
strings.append("\(number)")
}
print(doubledNumbers) // [0, 2, 4, 6, 8]
print(strings) // ["0", "1", "2", "3", "4"]
mapメソッドの使用import Foundation
let numbers: [Int] = [0, 1, 2, 3, 4]
var doubledNumbers: [Int] = [Int]()
var strings: [String] = [String]()
doubledNumbers = numbers.map({ (number: Int) -> Int in
return number * 2
})
strings = numbers.map({ (number: Int) -> String in
return "\(number)"
})
print(doubledNumbers) // [0, 2, 4, 6, 8]
print(strings) // ["0", "1", "2", "3", "4"]
モジュール表示の簡略化import Foundation
let numbers: [Int] = [0, 1, 2, 3, 4]
// 기본 클로저 표현식 사용
var doubledNumbers = numbers.map({ (number: Int) -> Int in
return number * 2
})
// 매개변수 및 반환 타입 생략
doubledNumbers = numbers.map({ return $0 * 2 })
print(doubledNumbers) // [0, 2, 4, 6, 8]
// 반환 키워드 생략
doubledNumbers = numbers.map({ $0 * 2 })
print(doubledNumbers) // [0, 2, 4, 6, 8]
// 후행 클로저 사용
doubledNumbers = numbers.map{ $0 * 2 }
print(doubledNumbers) // [0, 2, 4, 6, 8]
エンクロージャの再利用import Foundation
let evenNumbers: [Int] = [0, 2, 4, 6, 8]
let oddNumbers: [Int] = [0, 1, 3, 5, 7]
let multiplyTwo: (Int) -> Int = { $0 * 2 }
let doubledEvenNumbers = evenNumbers.map(multiplyTwo)
print(doubledEvenNumbers) // [0, 4, 8, 12, 16]
let doubledOddNumbers = oddNumbers.map(multiplyTwo)
print(doubledOddNumbers) // [0, 2, 6, 10, 14]
2.2番目の学習内容:フィルタ(Filter)
フィルタは、名前の通り、容器内の値をフィルタして抽出する高次関数です.
地図と同様に、新しいコンテナに値を含めて返します.
異なる点は、マッピングのように変形するのではなく、特定の条件に基づいて既存のコンテンツをフィルタリングできることです.
filter関数のパラメータとして渡される関数の戻りタイプはBool
コンテンツの値があり、アイテムが新しいコンテナに含まれると判断した場合はtrueを返し、含まない場合はfalseを返します.
import Foundation
let numbers: [Int] = [0, 1, 2, 3, 4, 5]
let evenNumbers: [Int] = numbers.filter { (number: Int) -> Bool in
return number % 2 == 0
}
print(evenNumbers) // [0, 2, 4]
let oddNumbers: [Int] = numbers.filter{ $0 % 2 == 1 }
print(oddNumbers) // [1, 3, 5]
マッピングとフィルタリング方法の関連付けの使用import Foundation
let numbers: [Int] = [0, 1, 2, 3, 4, 5]
let mappedNumbers: [Int] = numbers.map{ $0 + 3 }
let evenNumbers: [Int] = mappedNumbers.filter { (number: Int) -> Bool in
return number % 2 == 0
}
print(evenNumbers) // [4, 6, 8]
// mappedNumbers를 굳이 여러 번 사용할 필요가 없다면 메서드를 체인처럼 연결하여 사용할 수 있음
let oddNumbers: [Int] = numbers.map{ $0 + 3 }.filter{ $0 % 2 == 1 }
print(oddNumbers) // [3, 5, 7]
3.3つ目の学習内容:Reduce
SwiftのReduceには2つの形式があります
最初のreduceは、各要素を受信して演算し、次のモジュールを実行するために値を返す循環コンテナです.
public func reduce<Result>(_ initialResult: Result,
_nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result
第2の再生方法は、コンテナを循環させ、キャビネットを実行しますが、キャビネットは結果値を返しません.inoutパラメータを使用して初期値を直接演算しますpublic func reduce<Result>(into initialResult: Result,
_ updateAccumulatingResult: (inout Result, Element) throws -> ()) rethrows ->
Result
reduceメソッドの使用初期値は0で、整数配列のすべての値を追加します.
import Foundation
let numbers: [Int] = [1, 2, 3]
// 첫 번째 형태인 reduce(_:_:) 메서드의 사용
var sum: Int = numbers.reduce(0, { (result: Int, next: Int) -> Int in
print("\(result) + \(next)")
// 0 + 1
// 1 + 2
// 3 + 3
return result + next
})
print(sum) // 6
初期値は0で、整数配列のすべての値を減算します.let subtract: Int = numbers.reduce(0, { (result: Int, next: Int) -> Int in
print("\(result) - \(next)")
// 0 - 1
// -1 - 2
// -3 - 3
return result - next
})
print(subtract) // -6
初期値は3で、整数配列のすべての値を加算します.let sumFromThree: Int = numbers.reduce(3) {
print("\($0) + \($1)")
// 3 + 1
// 4 + 2
// 6 + 3
return $0 + $1
}
print(sumFromThree) // 9
初期値は3で、整数配列のすべての値を減算します.var subtractFromThree: Int = numbers.reduce(3) {
print("\($0) - \($1)")
// 3 - 1
// 2 - 2
// 0 - 3
return $0 - $1
}
print(subtractFromThree) // -3
reduce(:)メソッドを使用して文字列配列を接続するimport Foundation
let names: [String] = ["Sunny", "Steven", "Summer", "Kio", "Tak", "Coda"]
let reducedNames: String = names.reduce("yagom 2기 캠퍼들 : ") {
return $0 + ", " + $1
}
print(reducedNames) // yagom 2기 캠퍼들 : , Sunny, Steven, Summer, Kio, Tak, Coda
reduce(int::)メソッドを使用する第2の形式初期値は0で、整数配列のすべての値を加算します.
最初のタイルとは異なり、エンクロージャの値は返されません.
異なる点は、以前の値を直接内部で変更することです.
import Foundation
let numbers: [Int] = [1, 2, 3]
var sum = numbers.reduce(into: 0, { (result: inout Int, next: Int) in
print("\(result) + \(next)")
// 0 + 1
// 1 + 2
// 3 + 3
result += next
})
print(sum) // 6
初期値は3で、整数配列のすべての値を減算します.最初のタイルとは異なり、エンクロージャの値は返されません.
異なる点は、以前の値を直接内部で変更することです.
var subtractFromThree = numbers.reduce(into: 3, {
print("\($0) - \($1)")
// 3 - 1
// 2 - 2
// 0 - 3
$0 -= $1
})
print(subtractFromThree) // -3
最初のタイル形状とは異なるため、異なるコンテナ値を変更して配置することもできます.これにより、マップやフィルタのような形状を使用できます.
奇数をフィルタリングし、偶数を元の2倍に変更することで、[1,2,3]配列を直接演算できます.
![](https://s1.md5.ltd/image/21b5ceff70a80bd5c80d86b7f2ef92b8.png)
警備員のドアの下.isは何ですか.
間違いがあったが、ロビーは...🤔
フィルタとマップの外観の使用
var doubledNumbers = [1, 2] + numbers.filter{ $0.isMultiple(of: 2) }.map { $0 * 2 }
print(doubledNumbers) // [1, 2, 4]
すべての名前を大文字に変換し、初期値が空の配列に直接演算します.let names: [String] = ["Sunny", "Steven", "Summer", "Kio", "Tak", "Coda"]
var upperCasedNames: [String]
upperCasedNames = names.reduce(into: [], {
$0.append($1.uppercased())
})
print(upperCasedNames) // ["SUNNY", "STEVEN", "SUMMER", "KIO", "TAK", "CODA"]
マップの外観を使用するvar upperCasedNames = names.map { $0.uppercased() }
print(upperCasedNames) // ["SUNNY", "STEVEN", "SUMMER", "KIO", "TAK", "CODA"]
マップ、フィルタ、およびリフレッシュ方法の関連付けの使用let numbers: [Int] = [1, 2, 3, 4, 5, 6, 7]
// 짝수를 걸러내어 각 값에 3을 곱해준 후 모든 값을 더함
var result: Int = numbers.filter{ $0.isMultiple(of: 2) }.map{ $0 * 3 }.reduce(0){
$0 + $1 }
print(result) // 36
for in構文を使用する場合let numbers: [Int] = [1, 2, 3, 4, 5, 6, 7]
var result = 0
for number in numbers {
guard number.isMultiple(of: 2) else {
continue
}
result += number * 3
}
print(result) // 36
マップ、フィルタ、タイルの使用
import Foundation
enum CoffeeType {
case caffeine, decaffeination, unknown
}
struct coffeeMenu {
let name: String
let coffeeType: CoffeeType
var price: UInt
}
var coffees: [coffeeMenu] = [coffeeMenu]()
coffees.append(coffeeMenu(name: "카페 라떼", coffeeType: .caffeine, price: 4000))
coffees.append(coffeeMenu(name: "따듯한 아메리카노", coffeeType: .caffeine, price: 3500))
coffees.append(coffeeMenu(name: "에티오피아 원두 커피", coffeeType: .decaffeination, price: 3500))
// 카페인이 들어가면서 가격이 4천원 이하인 커피 메뉴 찾기
var result: [coffeeMenu] = coffees.map{ coffeeMenu(name: $0.name, coffeeType: $0.coffeeType, price: $0.price) }
result = result.filter{ $0.coffeeType == .caffeine && $0.price <= 4000 }
let string: String = result.reduce("카페인이 들어가면서 가격이 4천원 이하인 커피 메뉴 ☕️") { $0 + "\n" + "\($1.name) \($1.coffeeType) \($1.price)원"}
print(string)
//카페인이 들어가면서 가격이 4천원 이하인 커피 메뉴 ☕️
//카페 라떼 caffeine 4000원
//따듯한 아메리카노 caffeine 3500원
![](https://s1.md5.ltd/image/1e7a662148b2487c33e63ba8fc9cf324.png)
Reference
この問題について(210423 Fri), 我々は、より多くの情報をここで見つけました https://velog.io/@sunnywhynot/210423-Friテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol