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

相关文章
相关标签/搜索