Swift 3.0 beta 6权限访问修改

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
查看查看321 回复回复1 收藏收藏 分享淘帖 转播转播 分享分享 微信
查看: 321|回复: 1
收起左侧

Swift 3.0 beta 6权限访问修改

[复制链接]
3rdev 发表于 2016-8-19 09:32:19 | 显示全部楼层 |阅读模式
快来登录
获取最新的苹果动态资讯
收藏热门的iOS等技术干货
拷贝下载Swift Demo源代码
本帖最后由 3rdev 于 2016-8-19 09:32 编辑

前两天 Swift 3.0 更新了 beta 6,权限访问的几个关键字有了一些改变。这篇文章给大家简单介绍一下(真的很简单…)。

还有一些小改变,其中几个让人觉得很诡异:

  • 很多 Core xx 的库把 Swift原生的 Array 改成了 CFArray,很多时候需要用 as 去转换(Swift runtime 目前唯一一个比较显眼的功能…)。
  • 声明闭包的时候不能带显式 argument label, 例如 typealias completion = (data: Data, error: Error?) -> Void 就会报错, 必须加上_或者删掉参数标签。
  • 还有就是现在闭包作为参数传入的时候默认都是@nonescaping的,如果闭包不是在当前作用域内执行而是还要继续传递到别的函数里的话,那就必须加上@escaping 。
  • 引入了 Objective-C 的 id,在 Swift 叫做Any, 之前很多接口都从 AnyObject 改成了 Any, 而 Any 是没有 subscript 方法的, 看也就是说不能用键值对取值, 很多原本要通过键值对取值的写法都得先把类型强转成字典或者是 Anyobject? 。


Swift 3.0 beta 6权限访问修改

Swift 3.0 beta 6权限访问修改 - 敏捷大拇指 - Swift 3.0 beta 6权限访问修改





1、新增 open 关键字, public 变得没那么 public

beta 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提案。

[Swift] 纯文本查看 复制代码
//--------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 。





2、默认权限更改为 fileprivate, 而 private 变得更加 private

不写任何修饰符的话, beta 6之前默认是 public。 为了安全, 我们很多时候都必须在变量和实现的函数前面加上 private , 而 beta 6现在的默认访问权限就类似于之前的 private, 默认为 fileprivate, 文件内可被访问, 文件外不可访问。

[Swift] 纯文本查看 复制代码
//---- 文件 Foo.swift ----
class Stack {
    fileprivate var one = 1
    func two() {...}
}
class Over {
    // 正常运行
    func a() {
        var foo = Foo()
        print(foo.one)
        foo.two()
    }
}
//--------- EOF ---------
//----- 文件 A.swift -----
class Flow {
    // 都报错, 提示 one 跟 two 都不可被访问
    func a() {
        var stack = Stack()
        print(stack.one)
        stack.two()
    }
}
//--------- EOF ---------


而 private 就变得更加 Private, 只有作用域内可以访问。

[Swift] 纯文本查看 复制代码
class Foo {
    private var one = 1
    var two = 2
}
extension Foo {
    func bar() {
        one = 2 // 报错
        two = 3 // 正常运行
    }
}





参考链接

[SE-0117]Allow distinguishing between public access and public overridability

What is the ‘open’ keyword in Swift?




作者:四娘

都看到这里了,就把这篇资料推荐给您的好朋友吧,让他们也感受一下。

回帖是一种美德,也是对楼主发帖的尊重和支持。

*声明:敏捷大拇指是全球最大的Swift开发者社区、苹果粉丝家园、智能移动门户,所载内容仅限于传递更多最新信息,并不意味赞同其观点或证实其描述;内容仅供参考,并非绝对正确的建议。本站不对上述信息的真实性、合法性、完整性做出保证;转载请注明来源并加上本站链接,敏捷大拇指将保留所有法律权益。如有疑问或建议,邮件至marketing@swifthumb.com

*联系:微信公众平台:“swifthumb” / 腾讯微博:@swifthumb / 新浪微博:@swifthumb / 官方QQ一群:343549891(满) / 官方QQ二群:245285613 ,需要报上用户名才会被同意进群,请先注册敏捷大拇指

嗯,不错!期待更多好内容,支持一把:
支持敏捷大拇指,用支付宝支付10.24元 支持敏捷大拇指,用微信支付10.24元

评分

参与人数 1金钱 +10 贡献 +10 专家分 +10 收起 理由
Anewczs + 10 + 10 + 10 32个赞!专家给力!

查看全部评分

本帖被以下淘专辑推荐:

swifter 发表于 2016-8-22 18:48:13 | 显示全部楼层
Mark!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

做任务,领红包。
我要发帖

分享扩散

都看到这里了,就把这资料推荐给您的好朋友吧,让他们也感受一下。
您的每一位朋友访问此永久链接后,您都将获得相应的金钱积分奖励
热门推荐

合作伙伴

Swift小苹果

  • 北京治世天下科技有限公司
  • ©2014-2016 敏捷大拇指
  • 京ICP备14029482号
  • Powered by Discuz! X3.1 Licensed
  • swifthumb Wechat Code
  •   
快速回复 返回顶部 返回列表