原文地址: https://kemchenj.github.io/20...html
title: Swift 3.0 beta 6權限訪問修改git
前兩天 swift 3.0 更新了 beta 6, 權限訪問的幾個關鍵字有了一些改變, 這篇文章給你們簡單介紹一下(真得很簡單...)github
還有一些小改變, 其中幾個讓人以爲很詭異:swift
不少 Core xx 的庫把 swift原生的 Array 改爲了 CFArray, 不少時候須要用 as 去轉換(swift runtime 目前惟一一個比較顯眼的功能...)api
聲明閉包的時候不能帶顯式 argument label, 例如typealias completion = (data: Data, error: Error?) -> Void
就會報錯, 必須加上_
或者刪掉參數標籤安全
還有就是如今閉包做爲參數傳入的時候默認都是@nonescaping
的, 若是閉包不是在當前做用域內執行而是還要繼續傳遞到別的函數裏的話, 那就必須加上@escaping
閉包
引入了 Objective-C 的 id
, 在 Swift 叫作Any
, 以前不少接口都從 AnyObject
改爲了 Any
, 而 Any
是沒有 subscript
方法的, 看也就是說不能用鍵值對取值, 不少本來要經過鍵值對取值的寫法都得先把類型強轉成字典或者是 Anyobject?app
<!--more-->ide
open
關鍵字, public
變得沒那麼 publicbeta 6 新增長了 open
關鍵字, 能夠理解爲以前的 public函數
在同一個包 module 內, public 跟 open 的含義是同樣的, 可是在 module 外, open 聲明的成員變量和函數是能夠被 override 的, 而 public 只是把接口公開出去, 而不能被 override
open
大概有這麼幾個規則:
一個類能夠被聲明爲 open
.
一個類不能同時聲明 open
和 final
一個 open
的類的父類必須也是 open
的, 父類的父類也必須會被按照這條規則遞歸約束
這個主要是區分開 Module 外可訪問和 Module 外可被修改這兩個概念, 具體能夠看[[SE-0117]Allow distinguishing between public access and public overridability](https://github.com/apple/swif...提案
//--------Module Foo------- class Foo { public var one: Int { return 1 } open var two: Int { return 2 } } class A: Foo { // 正常運行 override var one: Int { return 2 } // 正常運行 override var two: Int { return 1 } } //------End of Module------ //--------Module Bar------- class B: Foo { // 報錯 override var one: Int { return 2 } // 正常運行 override var two: Int { return 1 } } //------End of Module------
另外還有一點, 就是 Objective-C 的庫導入的話默認都爲 open
, 以前是 public
moduleprivate
和fileprivate
, 而 private
變得更加 private這一次還新增了一個 moduleprivate
, 從字面意義上來講跟 internal
很像, 我如今還不太清楚到底跟 internal 有什麼具體的區別, 在 Swift Evolution 和 Xcode 的 Release Note 裏都沒有找到具體的解釋
爲了權限安全, 咱們不少時候都會在變量和實現的函數前面加上 private
, 如今須要改爲 fileprivate
, fileprivate
跟以前的 private
基本上同樣
而 private
如今就更加 private, 只能在當前做用域內發生做用, 同一文件裏 extension
裏也是不能訪問的到 private
修飾的成員變量
//---- 文件 Foo.swift ---- class { fileprivate var one = 1 private func two() {...} } extension Foo { func printOne() { print(one) // 正常運行 } func printTwo() { print(two) // 報錯 } } //--------- EOF --------- //-- 文件 Foo+Bar.swift -- extension Foo { // 都報錯 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](https://github.com/apple/swif...
#22 Swift 3 Access Control (Xcode 8 Beta 6)
初級 iOS 開發, 廣州地區求職 ing
簡歷: https://kemchenj.github.io/re...
聯繫方式: chenkem95@outlook.com