Swift 特殊关键字 与符号
2016-02-02 16:59
531 查看
#available()
函数来检查API函数的可用性// 判断当前版本是否 iOS8.0+,OSX10.10+以及以其他平台 if #available(iOS 8.0, OSX 10.10, *) { // 当版本匹配时 } else { //当版本不匹配时 } 也可以放在方法前面, 使其方法在某个版本可用 // iOS8.0+,OSX10.10+以及以其他平台可用 @available(iOS 8.0, OSX 10.10, *) func startUserActivity() -> NSUserActivity { }
新的guard语法:
这个新的语法允许你在一个代码周期中构建一个提前的退出点, 避免了大量的if 判断如果 a >= b 就会进入else直接退出 guard a < b else { return }
optional
修饰 protocol时方法不用必须实现强制展开(!)
如果对一个nil的optional 的变量进行强制展开(就是加上!), 会出现运行时错误, 所以如果对变量进行强制展开必须要保证Optional的变量不为nil使用问号(
?)来替代原来的叹号(
!)
if optionalChaining.string?.characters.count > 0 { }
只有optionalChaining.string不为nil的适合才能访问characters
convenience
其内部一定要调用其同类的init方法完成初始化注意: 子类不能重写这个方法或从子类中以super的方式调用, 子类一旦重写这个方法调用的init方法就会调用这个方法, 所以不需要重写
用法: 如果你想某些子类一定要调用某个初始化方法, 那么就可以在父类中加上一个convenience初始化方法, 这样子类每次创建对象的同时都会去调用这个init方法
如果想强制子类一定调用这个方法, 可以结合required 修饰符在所调用的init方法前面加上required
required修饰符的使用规则
required修饰符只能用于修饰类初始化方法。
当子类含有异于父类的初始化方法时(初始化方法参数类型和数量异于父类),子类必须要实现父类的
required初始化方法,并且也要使用
required修饰符而不是
override。
当子类没有初始化方法时,可以不用实现父类的
required初始化方法。
注意: 子类如果集成父类一定要在重写父类init方法时候调用[super init], swift强制这么做
protocol SomeProtocol { init(someParameter: Int) }
class SomeClass: SomeProtocol { required init(someParameter: Int) { // 这里是构造器的实现部分 } }
mutating
修饰方法能修改同实例属性值协议 方法前面加上mutating 表示遵守协议的结构体 / 枚举能修改同实例属性
结构体/ 枚举中 方法要修改同实例属性需要在方法前面加上mutating, 表示你可以修改同实例属性
enum OnOffSwitch: Togglable { case Off, On mutating func toggle() { switch self { case Off: self = On case On: self = Off } } } var lightSwitch = OnOffSwitch.Off lightSwitch.toggle() // lightSwitch 现在的值为 .On
typealias type
// 对原有类型, 声明一个新名称, 相当于以前的typedef@testable
当你的应用程序包含单元测试 target 时,为了测试,测试模块需要访问应用程序模块中的代码。默认情况下只有public级别的实体才可以被其他模块访问。然而,如果在导入应用程序模块的语句前使用
@testable特性,然后在允许测试的编译设置(
Build Options -> Enable Testability)下编译这个应用程序模块,单元测试 target 就可以访问应用程序模块中所有
internal级别的实体。
fallthrough
用在swich case 中表示, 上下case 可以一起执行__FILE__
当前文件路径Defer 语句
defer 语句用于在退出当前作用域之前执行代码。inout
传进去的参数直接可以修改, 就像传进去是地址, 地址对应的值被修改,调用的时候在变量前面加上&
deinit
析构函数, 相当于oc中deallocis
一般做判断使用swift3.0
fileprivate 与 private
fileprivate 就是以前的 private 整个文件都能访问private 现在是只能在当前class内部访问
如果在extention访问private的变量 会报variable is inaccessible due to 'private' protection level
open 与 public
现在swift 的变量作用域修饰符有如下几种(从高到低): open, public, fileprivate, privateopen: 以前的public, 所有地方都能访问, 并且能重写, 能继承
public: 只能访问在module内部重写, 能访问. 继承
inout
inout作为函数声明时,引用传值的关键字。但是在调用的时候引用的是地址,所以在引用的时候要加上 &override func viewDidLoad() { super.viewDidLoad() var a = 10 var b = 20 var _ = test(a: &a, b: &b); } func test(a: inout Int, b: inout Int) -> Int{ return a + b }
nonmutating
在声明值类型的实例为不可变变量,即let时,是不可以修改任何它内部的变量值的
struct TTTTStruct { var name: String { get { return "123456" } nonmutating set { print(newValue) } } } class TTClass2: TTClass { override func ghjk() { let sttttt = TTTTStruct() sttttt.name = "4546" name = "1234" print(name) } }
associatedtype
associatedtype用于
protocol中,
associatedtype类型是在
protocol中代指一个确定类型并要求该类型实现指定方法。
相关文章推荐
- Swift 引用计数总结 Strong,Weak, unowned 简单使用
- Swift - 操作SQLite数据库(引用SQLite3库)
- Swift 协议(Protocols)
- swift里的函数和闭包
- Swift解析JSON数据
- iOS8开发~Swift(一)入门
- 【引】swift是什么?
- swift-结构体和类创建的变量
- swift-setter&getter
- swift-类
- 弱引用?强引用?未持有?额滴神啊-- Swift 引用计数指导
- 11.Swift 中的类和结构体
- swift-比较运算符
- 用 Swift、Foursquare API 和 Realm 創建一個咖啡屋 App
- 游戏中的三角学——Sprite Kit 和 Swift 教程(2)
- 游戏中的三角学——Sprite Kit 和 Swift 教程(1)
- Swift 集合类型 Arrays 、 Sets 、 Dictionarys - 1
- swift enumerations
- Swift 扩展(extension)
- swift closure闭包