前兩天 swift 3.0 更新了 beta 6, 權(quán)限訪問的幾個(gè)關(guān)鍵字有了一些改變, 這篇文章給大家簡單介紹一下(真得很簡單...)
還有一些小改變, 其中幾個(gè)讓人覺得很詭異:
- 很多 Core xx 的庫把 swift原生的 Array 改成了 CFArray, 很多時(shí)候需要用 as 去轉(zhuǎn)換(swift runtime 目前唯一一個(gè)比較顯眼的功能...)
- 聲明閉包的時(shí)候不能帶顯式 argument label, 例如
typealias completion = (data: Data, error: Error?) -> Void
就會(huì)報(bào)錯(cuò), 必須加上_
或者刪掉參數(shù)標(biāo)簽 - 還有就是現(xiàn)在閉包作為參數(shù)傳入的時(shí)候默認(rèn)都是
@nonescaping
的, 如果閉包不是在當(dāng)前作用域內(nèi)執(zhí)行而是還要繼續(xù)傳遞到別的函數(shù)里的話, 那就必須加上@escaping
- 引入了 Objective-C 的
id
, 在 Swift 叫做Any
, 之前很多接口都從AnyObject
改成了Any
, 而Any
是沒有subscript
方法的, 看也就是說不能用鍵值對取值, 很多原本要通過鍵值對取值的寫法都得先把類型強(qiáng)轉(zhuǎn)成字典或者是 Anyobject?
新增 open
關(guān)鍵字, public
變得沒那么 public
beta 6 新增加了 open
關(guān)鍵字, 可以理解為之前的 public
在同一個(gè)包 module 內(nèi), public 跟 open 的含義是一樣的, 但是在 module 外, open 聲明的成員變量和函數(shù)是可以被 override 的, 而 public 只是把接口公開出去, 而不能被 override
open
大概有這么幾個(gè)規(guī)則:
- 一個(gè)類可以被聲明為
open
. - 一個(gè)類不能同時(shí)聲明
open
和final
- 一個(gè)
open
的類的父類必須也是open
的, 父類的父類也必須會(huì)被按照這條規(guī)則遞歸約束
這個(gè)主要是區(qū)分開 Module 外可訪問和 Module 外可被修改這兩個(gè)概念, 具體可以看[SE-0117]Allow distinguishing between public access and public overridability提案
//--------Module Foo-------
class Foo {
public var one: Int {
return 1
}
open var two: Int {
return 2
}
}
class A: Foo {
// 正常運(yùn)行
override var one: Int {
return 2
}
// 正常運(yùn)行
override var two: Int {
return 1
}
}
//------End of Module------
//--------Module Bar-------
class B: Foo {
// 報(bào)錯(cuò)
override var one: Int {
return 2
}
// 正常運(yùn)行
override var two: Int {
return 1
}
}
//------End of Module------
另外還有一點(diǎn), 就是 Objective-C 的庫導(dǎo)入的話默認(rèn)都為 open
, 之前是 public
新增moduleprivate
和fileprivate
, 而 private
變得更加 private
這一次還新增了一個(gè) moduleprivate
, 從字面意義上來說跟 internal
很像, 我現(xiàn)在還不太清楚到底跟 internal 有什么具體的區(qū)別, 在 Swift Evolution 和 Xcode 的 Release Note 里都沒有找到具體的解釋
為了權(quán)限安全, 我們很多時(shí)候都會(huì)在變量和實(shí)現(xiàn)的函數(shù)前面加上 private
, 現(xiàn)在需要改成 fileprivate
, fileprivate
跟之前的 private
基本上一樣
而 private
現(xiàn)在就更加 private, 只能在當(dāng)前作用域內(nèi)發(fā)生作用, 同一文件里 extension
里也是不能訪問的到 private
修飾的成員變量
//---- 文件 Foo.swift ----
class {
fileprivate var one = 1
private func two() {...}
}
extension Foo {
func printOne() {
print(one) // 正常運(yùn)行
}
func printTwo() {
print(two) // 報(bào)錯(cuò)
}
}
//--------- EOF ---------
//-- 文件 Foo+Bar.swift --
extension Foo {
// 都報(bào)錯(cuò)
func printOneAgain() {
print(one)
}
func printTwoAgain() {
print(two)
}
}
//--------- EOF ---------
參考鏈接
What is the 'open' keyword in Swift?
[SE-0117]Allow distinguishing between public access and public overridability
#22 Swift 3 Access Control (Xcode 8 Beta 6)
初級(jí) iOS 開發(fā), 廣州地區(qū)求職 ing
簡歷: https://kemchenj.github.io/resume.html
聯(lián)系方式: chenkem95@outlook.com