Swift心得筆記之集合型別

2022-09-21 08:57:12 字數 4025 閱讀 7217

陣列

重複值的初始化

除了普通的初始化方法,我們可以通過 init(count: int, repeatedvalue: t) 來初始化乙個陣列並填充上重複的值:

複製** **如下:

// [0.0,0.0,0.0]

var threedoubles = [double](count:3,repeatedvalue:0.0)

帶索引值的遍歷

我們可以用 for in 遍歷陣列,如果想要 index 的話,可以用 enumerate程式設計客棧: sequencetype>(base: seq) :

複製** **如下:

let arr = ["a","b"]

for (index, value) in enumerate(arr)

// 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。使用得當的話可以省去很多不必要的**。

mapmap 可以把乙個陣列按照一定的規則轉換成另乙個陣列,定義如下:

複製** **如下:

func map(transform: (t) -> u) -> u

也就是說它接受乙個函式叫做 transform ,然後這個函式可以把 t 型別的轉換成 u 型別的並返回 (也就是 (t) -> u),最終 map 返回的是 u 型別的集合。

下面的表示式更有助於理解:

複製** **如下:

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

如果用 for in 來實現,則需要這樣:

複製** **如下:

程式設計客棧var newarray : array =

for item in oldarray

舉個例子,我們可以這樣把**陣列中的數字前面都加上 ¥ 符號:

複製** **如下:

var oldarray = [10,20,45,32]

var newarray = oldarray.map()

println(newarray) // [¥10, ¥20, ¥45, ¥32]

如果你覺得 money in 也有點多餘的話可以用 $0 :

複製** **如下:

newarray = oldarray.map()

filter

方法如其名, filter 起到的就是篩選的功能,引數是乙個用來判斷是否篩除的篩選閉包,定義如下:

複製** **如下:

func filter(includeelement: (t) -> bool) -> [t]

還是舉個例子說明一下。首先先看下傳統的 for in 實現的程式設計客棧方法:

複製** **如下:

var oldarray = [10,20,45,32]

var filteredarray : array =

for money in oldarray

}println(filteredarray)

奇怪的是這裡的**編譯不通過:

複製** **如下:

playground execution failed: :15:9: error: 'array' is not identical to 'uint8'

filteredarray += money

發現原來是 += 符號不能用於 append ,只能用於 combine ,在外麵包個 即可:

複製** **如下:

var oldarray = [10,20,45,32]

var filteredarray : array =

for money in oldarray

}println(filteredarray) // [45, 32]

(靠。。居然忘了貼 filter 的用法,寫到後面才發現。。)

用 filter 可以這樣實現:

複製** **如下:

var oldarray = [10,20,45,32]

var filteredarray  = oldarray.filter()

println(filteredarray) // [45, 32]

你真的好短啊!

reduce

reduce 函式解決了把陣列中的值整合到某個獨立物件的問題。定義如下:

複製** **如下:

func reduce(initial: u, combine: (u, t) -> u) -> u

好吧看起來略抽象。我們還是從 for in 開始。比如我們要把陣列中的值都加起來放到 sum 裡,那麼傳統做法是:

複製** **如下:

var oldarray = [10,20,45,32]

var sum = 0

for money in oldarray

println(sum) // 107

reduce 有兩個引數,乙個是初始化的值,另乙個是乙個閉包,閉包有兩個輸入的引數,乙個是原始值,乙個是新進來的值,返回的新值也就是下一輪迴圈中的舊值。寫幾個小例子試一下:

複製** **如下:

var oldarray = [10,20,45,32]

var sum = 0

sum = oldarray.reduce(0,) // 0+10+20+45+32 = 107

sum = oldarray.reduce(1,) // 1+10+20+45+32 = 108

sum = oldarray.reduce(5程式設計客棧,) // 5*10*20*45*32 = 1440000

sum = oldarray.reduce(0,+) // 0+10+20+45+32 = 107

println(sum)

大概就是這些。

map 用來解包可選型別

我們在解包可選型別的時候,通常會這麼做:

複製** **如下:

func increment(somenumber: int?) -> int? else

}increment(5)   // some 6

increment(nil) // nil

我們也可以用 map 來實現:

複製** **如下:

func increment(somenumber: int?) -> int?

}increment(5)   // some 6

increment(nil) // nil

包括其他可選型別也是可行的,比如 string :

複製** **如下:

func hello(somename: string?) -> string?

}hello("natashatherobot") // some "hello, natashatherobot"

hello(nil) // nil

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

複製** **如下:

func hello(somename: string?) -> string ?? "hello world!"

}hello("natashatherobot") // "hello, natashatherobot"

hello(nil)               // "hello world!"

擴充套件陣列和字典十分常用,而官方的方法功能有限。我們可以學習exswift 中 array.swift 的內容,給 array 新增一些 extension。

本文標題: swift心得筆記之集合型別

本文位址:

Swift 集合型別

swift語言提供陣列和字典的集合型別 swift 語言裡的陣列和字典中儲存的資料值型別必須明確 即陣列中只能存放同型別的資料。1 陣列 陣列的建立 var shoppinglist string tset hell hell var arrayint int 1,3 var arrayintex ...

Swift心得筆記之字串

字串 簡介string 中的字串是值型別,傳遞的www.cppcns.com時候會對值進行拷貝,而 nsstring 的字串傳遞則是引用。我們可以用 for in 遍歷字串 複製 如下 var a string a for c in hello 可以通過 countelements 計算字串的字元數...

swift學習筆記之string 型別轉換

在swift2.0中string型別的轉換發生了一些改變 其中取消了toint方法 要想講string型別轉換為int型別 要用如下的方法 var str string 12345 vars stras nsstring intvalue print s string型別轉換為double vars...