原文地址: 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