程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 更多關於編程 >> Swift心得筆記之聚集類型

Swift心得筆記之聚集類型

編輯:更多關於編程

Swift心得筆記之聚集類型。本站提示廣大學習愛好者:(Swift心得筆記之聚集類型)文章只能為提供參考,不一定能成為您想要的結果。以下是Swift心得筆記之聚集類型正文


數組

反復值的初始化

除通俗的初始化辦法,我們可以經由過程 init(count: Int, repeatedValue: T) 來初始化一個數組並填充上反復的值:


// [0.0,0.0,0.0]
var threeDoubles = [Double](count:3,repeatedValue:0.0)

帶索引值的遍歷

我們可以用 for in 遍歷數組,假如想要 index 的話,可以用 enumerate<Seq : SequenceType>(base: Seq) :


let arr = ["a","b"]
for (index, value) in enumerate(arr) {
    println("\(index):\(value)")
}
// 0:a
// 1:b

賦值與拷貝

Swift 中數組和字典均是構造體的情勢完成的,和 NSArray 那一套不太一樣,所以賦值的時刻實際上是給了一份拷貝:


let hd = Resolution(width: 1920, height: 1080)
var cinema = hd
cinema.height = 233
cinema  // 1920 233
hd      // 1920 1080

高階函數

Swift 有一些 Higher Order Functions :map、filter和reduce。應用適合的話可以省去許多不用要的代碼。

map

map 可以把一個數組依照必定的規矩轉換成另外一個數組,界說以下:


func map<U>(transform: (T) -> U) -> U[]

也就是說它接收一個函數叫做 transform ,然後這個函數可以把 T 類型的轉換成 U 類型的並前往 (也就是 (T) -> U),終究 map 前往的是 U 類型的聚集。

上面的表達式更有助於懂得:


[ x1, x2, ... , xn].map(f) -> [f(x1), f(x2), ... , f(xn)]

假如用 for in 來完成,則須要如許:


var newArray : Array<T> = []
for item in oldArray {
    newArray += f(item)
}

舉個例子,我們可以如許把價錢數組中的數字後面都加上 ¥ 符號:


var oldArray = [10,20,45,32]
var newArray = oldArray.map({money in "¥\(money)"})
println(newArray) // [¥10, ¥20, ¥45, ¥32]

假如你認為 money in 也有點過剩的話可以用 $0 :


newArray = oldArray.map({"\($0)?"})

filter

辦法如其名, filter 起到的就是挑選的功效,參數是一個用來斷定能否篩除的挑選閉包,界說以下:


func filter(includeElement: (T) -> Bool) -> [T]

照樣舉個例子解釋一下。起首先看下傳統的 for in 完成的辦法:


var oldArray = [10,20,45,32]
var filteredArray : Array<Int> = []
for money in oldArray {
    if (money > 30) {
        filteredArray += money
    }
}
println(filteredArray)

奇異的是這裡的代碼編譯欠亨過:


Playground execution failed: <EXPR>:15:9: error: 'Array<Int>' is not identical to 'UInt8'
        filteredArray += money

發明本來是 += 符號不克不及用於 append ,只能用於 combine ,在裡面包個 [] 便可:


var oldArray = [10,20,45,32]
var filteredArray : Array<Int> = []
for money in oldArray {
    if (money > 30) {
        filteredArray += [money]
    }
}
println(filteredArray) // [45, 32]

(靠。。竟然忘了貼 filter 的用法,寫到前面才發明。。)

用 filter 可以如許完成:


var oldArray = [10,20,45,32]
var filteredArray  = oldArray.filter({
    return $0 > 30
})
println(filteredArray) // [45, 32]

你真的好短啊!

reduce

reduce 函數處理了把數組中的值整合到某個自力對象的成績。界說以下:


func reduce<U>(initial: U, combine: (U, T) -> U) -> U

好吧看起來略籠統。我們照樣從 for in 開端。好比我們要把數組中的值都加起來放到 sum 裡,那末傳統做法是:


var oldArray = [10,20,45,32]
var sum = 0
for money in oldArray {
    sum = sum + money
}
println(sum) // 107

reduce 有兩個參數,一個是初始化的值,另外一個是一個閉包,閉包有兩個輸出的參數,一個是原始值,一個是新出去的值,前往的新值也就是下一輪輪回中的舊值。寫幾個小例子試一下:


var oldArray = [10,20,45,32]
var sum = 0
sum = oldArray.reduce(0,{$0 + $1}) // 0+10+20+45+32 = 107
sum = oldArray.reduce(1,{$0 + $1}) // 1+10+20+45+32 = 108
sum = oldArray.reduce(5,{$0 * $1}) // 5*10*20*45*32 = 1440000
sum = oldArray.reduce(0,+) // 0+10+20+45+32 = 107
println(sum)

年夜概就是這些。

map 用來解包可選類型

我們在解包可選類型的時刻,平日會這麼做:


func increment(someNumber: Int?) -> Int? {
    if let number = someNumber {
        return number + 1
    } else {
        return nil
    }
}
increment(5)   // Some 6
increment(nil) // nil

我們也能夠用 map 來完成:


func increment(someNumber: Int?) -> Int? {
    return someNumber.map { number in number + 1 }
}

increment(5)   // Some 6
increment(nil) // nil

包含其他可選類型也是可行的,好比 String :


func hello(someName: String?) -> String? {
    return someName.map { name in "Hello, \(name)"}
}
hello("NatashaTheRobot") // Some "Hello, NatashaTheRobot"
hello(nil) // nil

再搭配上 ?? 符號,嗯根本夠用了:


func hello(someName: String?) -> String {
    return someName.map { name in "Hello, \(name)" } ?? "Hello world!"
}

hello("NatashaTheRobot") // "Hello, NatashaTheRobot"
hello(nil)               // "Hello world!"

擴大

數組和字典非常經常使用,而官方的辦法功效無限。我們可以進修ExSwift 中 Array.swift 的內容,給 Array 添加一些 Extension。

以上所述就是本文的全體內容了,願望年夜家可以或許愛好。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved