Swift 3.0 beta 6權限訪問修改

原文地址: https://kemchenj.github.io/20...html


title: Swift 3.0 beta 6權限訪問修改git

date: 2016-08-17 17:14

前兩天 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 變得沒那麼 public

beta 6 新增長了 open 關鍵字, 能夠理解爲以前的 public函數

在同一個包 module 內, public 跟 open 的含義是同樣的, 可是在 module 外, open 聲明的成員變量和函數是能夠被 override 的, 而 public 只是把接口公開出去, 而不能被 override

open 大概有這麼幾個規則:

  • 一個類能夠被聲明爲 open.

  • 一個類不能同時聲明 openfinal

  • 一個 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

新增 moduleprivatefileprivate, 而 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

相關文章
相關標籤/搜索