前言
在WWDC2016中Swift3.0發(fā)布,在大會(huì)中官方也提到了很多關(guān)于Swift的新改變和突破,接下來(lái)我們來(lái)了解一下一些新改變.
本章主要是了解一些在實(shí)際開(kāi)發(fā)中需要用到的方法或者函數(shù),我使用的是Xcode8測(cè)試版, 在測(cè)試版中有很多坑,比如:打開(kāi)自己以前的Swift項(xiàng)目,就會(huì)報(bào)幾百個(gè)錯(cuò)誤,這些都是語(yǔ)法上的錯(cuò)誤,因?yàn)樵赟wift3.0中的語(yǔ)法和之前版本的Swift有很大的出入, 根據(jù)它的提示,將原來(lái)的語(yǔ)法,變成Swift3.0的語(yǔ)法,然后save即可.
Swift3.0 有什么改變呢?
(一), 函數(shù)或方法參數(shù)有變動(dòng)
- 在Swift3.0之前, 方法的參數(shù)的名稱默認(rèn)第0個(gè)是省略的,也就是說(shuō)在第1個(gè)參數(shù)時(shí)才會(huì)有名稱
Swift3.0必須每個(gè)參數(shù)都需要指明參數(shù)的名稱, 當(dāng)然我們可以使用"_"來(lái)修飾參數(shù),說(shuō)明在調(diào)用的時(shí)候可以省略
// 以前的做法
func sum (mun1: Int, num2: Int) -> Int { return num1 + num2 } // 方法
sum( 15, num2: 15) // 調(diào)用方法
// swift3.0的做法
func sum (mun1: Int, num2: Int) -> Int { return num1 + num2 } // 方法
sum( num: 15, num2: 15) // 調(diào)用方法
(二), 取消了var參數(shù),原因是和inout沖突了
- 1, 以前在方法中將參數(shù)設(shè)置為變量時(shí),只需要在變量前設(shè)置為var即可,但是在Swift3.0中就會(huì)報(bào)錯(cuò), 不能直接在方法中使用var來(lái)設(shè)置變量
// 在Swift3.0之前
func increase (var a: Int) {
a += 1
}
// swift3.0
func increase ( a: Int) {
var a = a
a += 1
}
- 2, 雖然在方法或者函數(shù)中不能使用var,但是可以使用inout, 但是,這里有一個(gè)細(xì)節(jié), 就是inout的位置
例如:
// 在Swift3.0之前
func increase (inout a: Int) {
a += 1
}
// 在Swift3.0之后就不能這樣了
func increase (a: inout Int) {
a += 1
}
(三), 在Swift3.0中方法的返回值必須要有接收,否則就會(huì)報(bào)警告或者報(bào)錯(cuò),主要的目的就是提醒開(kāi)發(fā)者需要接收方法的返回值,當(dāng)我們不需要接收返回值時(shí),我們有兩種方法告訴編譯器此方法可以不用接收方法的返回值
override func viewDidLoad() {
super.viewDidLoad()
方式一: 需要@discardableResult
let ca = function()
ca.sum(a: 10, b: 10) // 這里會(huì)有一個(gè)警告,提示開(kāi)發(fā)者需要接收返回值
方式二: 不需要@discardableResult
let _ = ca.sum(a: 10, b:10)
}
struct function {
@discardableResult
func sum(a: Int, b: Int) -> Int {
return a + b
}
}
注意這里我們使用了struct, 我們來(lái)看看它和Class的區(qū)別
在Swift中struct與Class非常相似, 但是他們還是有點(diǎn)區(qū)別的
區(qū)別一: struct沒(méi)有繼承功能,但是class是可以繼承的
區(qū)別二: 區(qū)別體現(xiàn)在內(nèi)存上, struct是通過(guò)值傳遞的,而class是通過(guò)引用來(lái)傳遞的.
(四), 可選類(lèi)型上的變化
- 在Swift3.0開(kāi)始可選類(lèi)型就更加的嚴(yán)格了, 隱式的可選類(lèi)型和其他類(lèi)型的運(yùn)算之后所得到的是可選類(lèi)型,而不是隱式類(lèi)型
let a: Int! = 1
let b = a + 1 // b是Int類(lèi)型
let c = a // c是Int?類(lèi)型
print("b的值是\(b), c的值\(c)")
(五), 自定義代理協(xié)議時(shí),也有一點(diǎn)變化
- 在Swift3.0之前,定義協(xié)議只需要在協(xié)議(protocol)前面添加@objc即可,但是在Swict3.0中定義協(xié)議除了在協(xié)議前面加@objc外,在協(xié)議中的方法的修飾符前也要加@objc
@objc pritocol SinaHomeDelegate {
@objc optional func func1()
func func2()
}
(六), 在Swift3.0中移除了"++","--"兩種自增或自減兩種操作符
// 在swift3.0之前
var a = 1
a++ // 在舊版的Swift中這是可以的,但是在Swift3.0之后就會(huì)報(bào)錯(cuò),不能這樣寫(xiě)了
// 在Swift3.0之后
只能寫(xiě)成 var b = 1
b = b + 1 或者 b += 1(建議寫(xiě)法)
(七), 取消了C語(yǔ)言中的for循環(huán)風(fēng)格
// 在舊版的Swift中 for循環(huán)可以寫(xiě)成這種:
for i = 0; i < 10; i += 1 {
print(i)
}
// 但是在Swift3.0中不能這樣寫(xiě),這樣會(huì)報(bào)錯(cuò), 原因是在新版的Swift中已經(jīng)移除了這種C語(yǔ)言樣式的寫(xiě)法
for i in 0..<10 {
pring(i)
} // 正確寫(xiě)法
(八), SDK類(lèi)中的變化
- 在以前的Swift中,很多方法或者函數(shù)都和OC很像,所以對(duì)很多OC開(kāi)發(fā)者來(lái)說(shuō),上手很容易,但是在Swift3.0后,徹底改變了
這種情況,原因是這樣可以消除函數(shù)又長(zhǎng)又臭的缺點(diǎn), 比如說(shuō): 消除了類(lèi)型前綴,方法名去重, 函數(shù)和方法去C風(fēng)格
// 1, 去掉類(lèi)型前綴
let url = URL(string:"www.baidu.com") // 以前的NSURL變成了URL
let data = Data() // 以前的寫(xiě)法: let data = NSData(),顯然現(xiàn)在的更加簡(jiǎn)潔
// 2, 可讀性更好了
let isFileURL = url?.isFileURL // 以前的寫(xiě)法是url?.fileURL, 現(xiàn)在的寫(xiě)法可讀性更好了
// 3, 移除多余的動(dòng)詞,其他名詞,介詞修飾語(yǔ),顯然這樣更加簡(jiǎn)單,簡(jiǎn)潔,易讀
var array = [1, 2, 3, 4]
array.append(contentsOf: [4, 5, 6]) // 以前的寫(xiě)法: array.appendContentsOf([4, 5, 6])
array.remove(at: 0) // 以前的寫(xiě)法: array.removeAtIndex(0)
// 4, 在Swift3.0中盡量消除重復(fù),可以減少語(yǔ)義歧義
例如:
btn.backgroundColor = UIColor.red() // 以前的寫(xiě)法: btn.backgroundColor = UIColor.redColor()
// 5,枚舉的成員首字母變成了小寫(xiě)
label.textAlignment = .center // 以前的寫(xiě)法: label.textAlignment = .Center
// 如果按鈕的狀態(tài)是普通狀態(tài)時(shí),normal可以省略變?yōu)?)
let btn = UIButton()
btn.setTitle("按鈕", for: UIControlState()) // Nomal狀態(tài)可以省略Normal
btn.frame = CGRect(x: 100, y: 100, width: 50, height: 50) // 不在是CGRectMake....
btn.backgroundColor = UIColor.red() // 不在是redColor()
view.addSubview(btn)
(九), 去C風(fēng)格后,易讀性更好
// 1, 設(shè)置控件的frame
btn.frame = CGRect(x: 0, y: 0, width: 50, height: 50) // 以前的寫(xiě)法: CGRectMake(0, 0, 50, 50)
// 2, 語(yǔ)法簡(jiǎn)短易讀
if let context =
// 3. GCD的使用也有變化
// Swift3.0之前的寫(xiě)法是:
let queue = dispatch_queue_create("myQueue", nil)
dispatch_async(queue) { // 異步執(zhí)行queue隊(duì)列中的函數(shù)
// 執(zhí)行閉包中的方法
pringt("以前的寫(xiě)法")
}
// Swift3.0后的寫(xiě)法, 更加簡(jiǎn)潔,易讀
let queue = DispatchQueue(label: "myQueue")
queue.async {
// 執(zhí)行異步函數(shù)
print("hello Swift3.0")
}
// 4, 某些相關(guān)的常量定義被移動(dòng)到了枚舉內(nèi)部,比如說(shuō)通知的名稱
// 4.1, Swift3.0中的通知?jiǎng)?chuàng)建
NotificationCenter.default.addObserver(self, selector: #selector(loadDatas()), name: UserDefaults.didChangeNotification, object: nil)
// 但是在Swift3.0之前不是這樣的(區(qū)別在與通知名)
old:NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(loadDatas()), name: NSUserDefaultsDidChangeNotification, object: nil)
(十), 新的浮點(diǎn)型協(xié)議, Float, Double, CGFloat使用了新的協(xié)議,主要是提供了IEEE-754標(biāo)準(zhǔn)的屬性和方法
let a = 2 * Float.pi // 以前的寫(xiě)法: let a = 2 * M_PI
// 上面的寫(xiě)法可能還沒(méi)有以前的寫(xiě)法好讀好看,所以下面這種寫(xiě)法是推薦寫(xiě)法,簡(jiǎn)潔易讀
let a = 2.0 * .pi // 這樣的寫(xiě)法主要是取決于前面的是否是浮點(diǎn)類(lèi)型, 如果是后面的Float可以省