/*
断言: 当程序发生异常时, 如果希望找到出错位置并打印一个消息, 就可以使用断言, 即通过一个全局的函数 assert
assert 接受一个闭包作为其第一个参数, 第二个参数是一个字符串; 假如第一个闭包返回的是一个false, 那么这个字符串就会被打印到中控制台上, assert格式如下:
*/
//assert(()-> Bool, "Message")
// 如示例, 我们希望某个函数不为空, 如果为空则会使程序崩溃, 这时就可以使用assert, 当这个函数为空的时候, 会把后面的字符串打印到中控台, 这样就知道哪里出现问题了:
//assert(someFunction() != nil, "someFunction 返回了空值! ")
/*
precondition: 它和 assert 的格式类型, 也是动态的, 它会造成程序的提前终止并抛出错误信息; 前面讲过, Swift 数组的下标操作可能造成越界, 使用扩展的方式向其中怎敢爱一个方法来判断下标是否越界:
*/
extension Array {
func ifOutBounds(index:Int){
precondition((0..<endIndex).contains(index), "数组越界")
print("继续执行")
}
}
[1,2,3].ifOutBounds(index: 2) // index == 3 会被提前终止
//最后要注意: precondition 在一般代码中并不多见, 因为它是动态的, 只会在程序运行时进行检查; 适用于那些无法在编译器确定的风险情况;
/*
Swift4KVC和KVO语法 需要在xcode9 iOS11运行
*/
/*
struct 也支持 KVC
*/
struct ValueType {
var name:String
}
var object = ValueType(name: "小韩哥")
let name = ValueType.name
//set
object[keyPath: name] = "Swift4"
//get
let valueOfName = object[keyPath:name]
//
/*
KVO: 目前依然只有 NSObject 才支持KVO
http://www.cocoachina.com/ios/20170712/19830.html
*/
//注意:被观察的属性需要用dynamic修饰,否则也无法观察到。
//一个好消息是不需要在对象被回收时手动 remove observer。但是这也带来了另外一个容易被忽略的事情:观察的闭包没有被强引用,需要我们自己添加引用,否则当前函数离开后这个观察闭包就会被回收了。
class OCClass: NSObject {
dynamic var name:String
init(name : String) {
self.name = name
}
}
func TestKVO() {
var swiftClass : OCClass!
var ob: NSKeyValueObservation!
swiftClass = OCClass(name: "OC")
ob = swiftClass.observe(.name){
(ob, changed) in
let
new = ob.name
print(new)
}
swiftClass.name = "Swift4"
}
TestKVO()