Swift3.0 - 真的很簡(jiǎn)單
Swift3.0 - 數(shù)據(jù)類(lèi)型
Swift3.0 - Array
Swift3.0 - 字典
Swift3.0 - 可選值
Swift3.0 - 集合
Swift3.0 - 流控制
Swift3.0 - 對(duì)象和類(lèi)
Swift3.0 - 屬性
Swift3.0 - 函數(shù)和閉包
Swift3.0 - 初始化和釋放
Swift3.0 - 協(xié)議protocol
Swift3.0 - 類(lèi)和結(jié)構(gòu)體的區(qū)別
Swift3.0 - 枚舉
Swift3.0 - 擴(kuò)展
Swift3.0 - 下標(biāo)
Swift3.0 - 泛型
Swift3.0 - 異常錯(cuò)誤
Swift3.0 - 斷言
Swift3.0 - 自動(dòng)引用計(jì)數(shù)(strong,weak,unowned)
Swift3.0 - 檢測(cè)API
Swift3.0 - 對(duì)象的標(biāo)識(shí)
Swift3.0 - 注釋
Swift3.0 - 元類(lèi)型
Swift3.0 - 空間命名
Swift3.0 - 對(duì)象判等
Swift3.0 - 探究Self的用途
Swift3.0 - 類(lèi)簇
Swift3.0 - 動(dòng)態(tài)調(diào)用對(duì)象(實(shí)例)方法
Swift3.0 - 文本輸出
Swift3.0 - 黑魔法swizzle
Swift3.0 - 鏡像
Swift3.0 - 遇到的坑
基本
- 定義
list1 = ["你好","2","3","4"]
let list2:[String] = ["你好","2","3","4"]
let list3:[Any] = ["你好","2","3",3,UILabel()]
let list4:NSArray = ["你好","2","3","4",UILabel()]
let list5:NSMutableArray = ["1","2","3","4"]
- 清空數(shù)組
list2.removeAll() // 如果定義為var
list2 = [] // 如果定義為var
list5.removeAllObjects() // var 和let 都可以
list5 = [] // 如果定義為var
- 取代操作
shoppingList[4...6] = ["Bananas", "Apples"] // 將數(shù)組4...6 的范圍用指定的數(shù)組取代
- 插入移除操作
shoppingList.insert("Maple Syrup", at: 0)
let mapleSyrup = shoppingList.remove(at: 0)
let apples = shoppingList.removeLast()
- 遍歷數(shù)組
for item in shoppingList {
print(item)
}
for (index, value) in shoppingList.enumerated() {
print("Item \\(index + 1): \\(value)")
}
高級(jí)
- 認(rèn)識(shí)map
看一下它的定義
func map<T>(_ transform: (Element) throws -> T) rethrows -> [T]
解釋:
T 為泛型
transform: 閉包函數(shù) 我們需要給它傳入一個(gè)有參數(shù)有返回值的閉包函數(shù)
[T] 函數(shù)會(huì)返回給我們一個(gè)T類(lèi)型的數(shù)組
應(yīng)用:我們有這樣一個(gè)需求,給一組數(shù)據(jù)中大于20的數(shù)字乘以3
//1.先定義一個(gè)數(shù)組
var numbers = [21, 19, 7, 12]
//2.創(chuàng)建一個(gè)有一個(gè)參數(shù)一個(gè)返回值的閉包函數(shù)
var closure = {(number:Int) -> Int in
var result = number
if number > 20 {
result *= 3
}
return result
}
//3.調(diào)用map函數(shù)
print(numbers.map(closure))
由于swift有類(lèi)型推斷的功能,我們可以這樣寫(xiě)
let mappedNumbers = numbers.map({ number -> Int in
if number > 20{
return 3 * number
}
return number
})
如果沒(méi)有邏輯判斷,給所有值統(tǒng)一乘以3,我們甚至可以這樣寫(xiě)
let mappedNumbers = numbers.map({ number -> Int in
return number*3
})
再簡(jiǎn)潔點(diǎn)
let mappedNumbers = numbers.map({ number in
number*3
})
如果你要將數(shù)組中的值全部替換為0你可以像下面這樣
let mappedNumbers = numbers.map({_ in
return 0
})
我們測(cè)試一下 for ... in 和 map的速度
測(cè)試1:數(shù)組numbers的數(shù)字變?yōu)?0
for ... in
var numbers = Array(repeating: 3, count: 1000000)
var date1 = NSDate()
for i in 0..<numbers.count{
numbers[i] = 0
}
print(NSDate().timeIntervalSince(date1 as Date))
運(yùn)行兩次測(cè)試數(shù)據(jù)
0.0242440104484558
0.0248509645462036
map
var numbers = Array(repeating: 3, count: 1000000)
var date1 = NSDate()
var newNumbers = numbers.map({_ in
return 0
})
print(NSDate().timeIntervalSince(date1 as Date))
運(yùn)行兩次結(jié)果
0.219065964221954
0.201902985572815
我測(cè)試一下小數(shù)據(jù) 同時(shí)給100個(gè)數(shù)字的數(shù)組設(shè)置值
for ... in
0.000165998935699463
map
0.0013270378112793
結(jié)論:
在執(zhí)行速度上還是for...in 比較快
問(wèn)題1 :map的優(yōu)勢(shì)在哪里呢?
sort 排序
public func sorted(by areInIncreasingOrder: (Element, Element) -> Bool) -> [Element]
參數(shù):
areInIncreasingOrder 兩個(gè)參數(shù)一個(gè)返回值得閉包
我們給1萬(wàn)個(gè)數(shù)組進(jìn)行排序,測(cè)一下for in 循環(huán)排序的時(shí)間
// 冒泡排序法
ar date1 = NSDate()
numbers.sort(by: {$0 > $1})
var swap:Int
for i in 0..<numbers.count{
var num = numbers[i]
for j in i..<numbers.count{
if num < numbers[j]{
(num,numbers[j]) = (numbers[j],num)
}
}
}
運(yùn)行結(jié)果
3.54646998643875
3.48700600862503
使用sort 對(duì)100萬(wàn)個(gè)數(shù)字進(jìn)行排序
var numbers = Array(repeating: 3, count: 1000000)
for i in 0..<numbers.count{
numbers[i] = i
}
var date1 = NSDate()
numbers.sort(by: {$0 > $1})
print(NSDate().timeIntervalSince(date1 as Date))
運(yùn)行結(jié)果
2.71596896648407
2.66568303108215
結(jié)論:
如果使用排序建議使用蘋(píng)果給我們提供的方法