Swift语法笔记
Guard
guard是一种条件判断语句,可以类比if、assert。如果条件不符合,guard的else语句就运行,从而退出这个函数。
具体写法如下:
func fooGuard(x: Int?) { guard let x = x where x > 0 else { // 变量不符合条件判断时,执行下面代码 return } // 使用x x.description }
Subscripts
Subscripts用于给类(class)自定义下标,下标使用subscript关键字,然后跟一个圆括号,里面是该下标的参数和参数类型(在实际使用中该参数就相当于数组的index和字典的key一样),最后有该下标的返回值类型。
具体写法如下:
subscript(row: Int, col: Int) -> T { get { assert(row >= 0 && row < tileNumber) assert(col >= 0 && col < tileNumber) return boardArray[row*tileNumber + col] } set { assert(row >= 0 && row < tileNumber) assert(col >= 0 && col < tileNumber) boardArray[row*tileNumber + col] = newValue } }
如果你想定义一个只读的下标,那么可以不实现setter方法,并且可以省略getter方法的get关键字,编译器会判断出这是一个只读的下标。
Unowned
unowned和weak一样,可以用在防止循环引用的地方。区别在于:unowned
设置以后即使它原来引用的内容已经被释放了,它仍然会保持对被已经释放了的对象的一个 "无效的" 引用,它不能是 Optional 值,也不会被指向 nil
。如果你尝试调用这个引用的方法或者访问成员属性的话,程序就会崩溃。而 weak
则友好一些,在引用的内容被释放后,标记为 weak
的成员将会自动地变成 nil
(因此被标记为 @weak
的变量一定需要是 Optional 值)。关于两者使用的选择,Apple 给我们的建议是如果能够确定在访问时不会已被释放的话,尽量使用 unowned
,如果存在被释放的可能,那就选择用 weak
。
例如:
lazy var printName: ()->() = { [weak self] in if let strongSelf = self { print("The name is \(strongSelf.name)") } }
如果我们可以确定在整个过程中 self
不会被释放的话,我们可以将上面的 weak
改为 unowned
,这样就不再需要 strongSelf
的判断。
lazy var printName: ()->() = { [unowned self] in print("The name is \(self)") }
详细教程见:http://swifter.tips/retain-cycle/
Mutating
在swift含三种类型(type): structure , enumeration , class。
其中structure和enumeration是值类型( value type ),class是引用类型( reference type ),与objective-c不同的是,structure和enumeration也可以拥有方法。
虽然结构体和枚举可以定义自己的方法,但是默认情况下,实例方法中是不可以修改值类型的属性。为了能够在实例方法中修改属性值,可以在方法定义前添加关键字mutating。
具体写法如下:
struct Point { var x = 0, y = 0 mutating func moveXBy(x:Int,yBy y:Int) { self.x += x self.y += y } }
If case
是swift2.0新的匹配模式 但是要在xcode7环境编译
//新增使用enumeration匹配 也就是枚举匹配方式 if case .Some(let x) = someOptional { println("someOptional value is \(x)") //如果为nil情况,不会输出东西,因为匹配的是Some! }
//新增使用可选模式匹配 if case let x? = someOptional { println("someOptional value is \(x)") //不需要对x进行解包 }
let arrayOfOptionalInts: [Int?] = [nil, 2, 3, nil, 5] // 匹配非nil值 for case let number? in arrayOfOptionalInts { print("Found a \(number)") } // 输出: // Found a 2 // Found a 3 // Found a 5
Final
final 关键字可以用在 class,func 或者 var 前面进行修饰,表示不允许对该内容进行继承或者重写操作。
posted on 2015-12-29 11:50 bibibi_liuliu 阅读(310) 评论(0) 编辑 收藏 举报