jaywcjlove / swiftui-example

SwiftUI 示例,技巧和技术集合,帮助我构建应用程序,解决问题以及了解SwiftUI的实际工作方式。
https://jaywcjlove.github.io/swiftui-example
MIT License
469 stars 36 forks source link

循环 for..in, map, filter #9

Open jaywcjlove opened 3 years ago

jaywcjlove commented 3 years ago

实例

let values = [2.0, 4.0, 5.0, 7.0]
var squares: [Double] = []
for value in values {
   squares.append(value * value)
}
print(squares) // [4.0, 16.0, 25.0, 49.0]
let values = [2.0,4.0,5.0,7.0]
let squares2 = values.map({ (value: Double) -> Double in
  return value * value
})
print(squares2) // [4.0, 16.0, 25.0, 49.0]
let values = [2.0,4.0,5.0,7.0]
let squares2 = values.map { value in 
  value * value
}
print(squares2) // [4.0, 16.0, 25.0, 49.0]
let values = [2.0,4.0,5.0,7.0]
let squares = values.map { $0 * $0 }
print(squares) // [4.0, 16.0, 25.0, 49.0]
let scores = [0,28,124]
let words = scores.map {
    NumberFormatter.localizedString(from: NSNumber(value: $0), number: .spellOut)
}
print(words) // ["zero", "twenty-eight", "one hundred twenty-four"]
let milesToPoint = ["point1":120.0, "point2": 50.0,"point3": 70.0]
let kmToPoint = milesToPoint.map { name,miles in miles * 1.6093 }
print(kmToPoint) // [112.651, 193.11599999999999, 80.465]
let lengthInMeters: Set = [4.0, 6.2, 8.9]
let lengthInFeet = lengthInMeters.map { meters in meters * 3.2808 }
print(lengthInFeet) // [29.199120000000004, 20.340960000000003, 13.1232]
let digits = [1, 4, 5, 10, 15]
let even = digits.filter { (number) -> Bool in return
   number % 2 == 0
}
print(even) // [4, 10]

// -----> 简写 <------

let digits = [1, 4, 10, 15]
let even = digits.filter { $0 % 2 == 0 }
print(even) // [4, 10]

实例

func hashtags(in string: String) -> [String] {
    let words = string.components(
        separatedBy: .whitespacesAndNewlines
    )
    // 通过过滤器,我们可以删除所有不符合条件的元素
    // 给定的要求,在这种情况下,那些没有开始的要求
    // 以前置的"#"字字符:
    return words.filter { $0.starts(with: "#") }
}

let tags = hashtags(in: "#Swift by Hello #Basics")
print(tags) // ["#Swift", "#Basics"]

实例

func hashtags(in string: String) -> [String] {
    let words = string.components(
        separatedBy: .whitespacesAndNewlines
    )
    let tags = words.filter { $0.starts(with: "#") }
    // 使用'map',我们可以将闭包作为转换将值序列转换为新的值数组:
    return tags.map { $0.lowercased() }
}

let strings = [
    "I'm excited about #SwiftUI",
    "#Combine looks cool too",
    "This year's #WWDC was amazing"
]
let tags = strings.map { hashtags(in: $0) }
print(tags) // [["#swiftui"], ["#combine"], ["#wwdc"]]
jaywcjlove commented 3 years ago

Reduce

let items = [2.0, 4.0, 5.0, 7.0]
let total = items.reduce(10, +)
print(total) // 28.0
let codes = ["abc", "def", "ghi"]
let text = codes.reduce("", +)
print(text) // abcdefghi
let name = ["alan", "brian", "charlie"]
let scv = name.reduce("===") { text, name in
  "\(text), \(name)"
}
print(scv) // ===, alan, brian, charlie
jaywcjlove commented 3 years ago

FlatMap

let collections = [[5, 2, 7], [4, 8], [9, 1, 3]]
let flat = collections.flatMap { $0 }
print(flat) // [5, 2, 7, 4, 8, 9, 1, 3]
let people: [String?] = ["Tom", nil, "Peter", nil, "Harry"]
let valid = people.compactMap { $0 }
print(valid) // ["Tom", "Peter", "Harry"]
let collections = [[5, 2, 7], [4, 8], [9, 1, 3]]
let onlyEven = collections.flatMap { intArray in
  intArray.filter { $0 % 2 == 0 }
}
print(onlyEven) // [2, 4, 8]
let collections = [[5, 2, 7], [4, 8], [9, 1, 3]]
let onlyEven = collections.flatMap { $0.filter { $0 % 2 == 0 }}
print(onlyEven) // [2, 4, 8]
let numbers = ["42", "19", "notANumber"]
let ints = numbers.compactMap { Int($0) }
print(ints) // [42, 19]
jaywcjlove commented 3 years ago

Chaining 链式语法

let marks = [4, 5, 8, 2, 9, 7]
let totalPass = marks.filter { $0 >= 7}.reduce(0, +)
print(totalPass) // 24
let numbers = [20, 17, 35, 4, 12]
let evenSquares = numbers.map { $0 * $0 }.filter { $0 % 2 == 0 }
print(evenSquares) // [400, 16, 144]
jaywcjlove commented 3 years ago
let languages = ["English", "Tamil", "German"]
for language in languages {
     print(language)
}
// Output:
// English
// Tamil
// German
let languages = ["English", "Tamil", "German"]
languages.forEach { (language) in
    print("Language", language)
}
// Output:
// Language English
// Language Tamil
// Language German
let languages = ["English", "Tamil", "German"]
for (index, element) in languages.enumerated() {
    print("Index:", index, "Language:", element)
}
// Output:
// Index: 0 Language: English
// Index: 1 Language: Tamil
// Index: 2 Language: German
let languages = ["English", "Tamil", "German"]
for i in 0 ..< languages.count {
    print("Language \(i+1):", languages[i])
}
// Output:
// Language 1: English
// Language 2: Tamil
// Language 3: German
let languagesDict = [
    "England":"English", "Germany":"German", "Mexico":"Spanish"
]
for (country, language) in languagesDict {
    print("The \(country)'s Language is \(language)")
}

// Output:
// The England's Language is English
// The Mexico's Language is Spanish
// The Germany's Language is German
for i in 0...5 {
    print(i)
}
// Output:
// 0
// 1
// 2
// 3
// 4
// 5
for i in 0..<5 {
    print(i)
}
// Output:
// 0
// 1
// 2
// 3
// 4

倒序

for i in (0...5).reversed() {
    print(i)    
}
// Output:
// 5
// 4
// 3
// 2
// 1
// 0
for i in stride(from: 0, to: 10, by: 2) {
    print(i)
}
// Output:
// 0
// 2
// 4
// 6
// 8
for i in stride(from: 0, through: 10, by: 2) {
    print(i)
}

// Output:
// 0
// 2
// 4
// 6
// 8
// 10
var evenNumbers = [Int]()
for number in (0...100) {
    guard evenNumbers.count < 10 else {
        break
    }

    guard number % 2 == 0 else {
        continue
    }
    evenNumbers.append(number)
}
print(evenNumbers) // Output: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
let evenNumbers = (0...100).filter { number -> Bool in
    return number % 2 == 0
}.prefix(10)

print(evenNumbers) // Output: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
jaywcjlove commented 3 years ago
let nationals = ["Brits", "Spain", "Italy"]
let languages = ["English", "Spanish", "Italian"]
for i in 0 ..< nationals.count {
    var string = "\(nationals[i]) speaks"
    for _ in 1 ... 3 {
        string += " \(languages[i])"
    }
    print(string)
}
// Output:
// Brits speaks English English English
// Spain speaks Spanish Spanish Spanish
// Italy speaks Italian Italian Italian