写这篇文章是因为在使用Realm的时候遇到的一些困惑,查资料弄明白了所以然,写下来备忘。
使用Realm的时候需要取一个Realm的实例,官方示例如下:
// Get the default Realm let realm = try! Realm()
//方法1 if let realm = try? Realm() { } //方法2 guard let realm = try? Realm() else { return }
但方法1在Swift3.0下报错如下,原因是Realm()不会返回一个Optional对象,只能在函数返回Optional对象时才能使用try?
2D2B2C01-F963-475D-B9C7-7F394D98703B.png
方法2,代码始终走到了else里面,百思不得其解。后来使用官方示例代码,程序直接Crash,Realm抛了一个异常,是因为的我Model定义有问题!我猜测在获取Realm实例的时候,Realm会遍历所有的Model,如果Model有问题,Realm就抛异常。
1. try
如果函数可能抛出异常,那么需要try catch组合来捕获异常,或者抛给下一层级的调用者
do { let result = try doSomething() } catch { // Here you know about the error // Feel free to handle to re-throw } func doSomeOtherThing() throws -> Void { // Not within a do-catch block. // Any errors will be re-thrown to callers. let result = try doSomething() }
2. try!
不是生就是死,要么函数执行成功,一旦抛出异常,程序直接Crash,简单粗暴
let result = try! doSomething() // if an error was thrown, CRASH!
3. try?
使用 if let + try? 组合,如果成功返回一个可选值,失败进入else,异常被忽略掉了,你不会知道到底是什么异常
`
if let result = try? doSomething() {
// doSomething succeeded, and result is unwrapped.
} else {
// Ouch, doSomething() threw an error.
}
`
使用guard关键字,抛出异常后进入else。但是异常被忽略掉了,这点和使用 if let 一样
guard let result = try? doSomething() else { // Ouch, doSomething() threw an error. } // doSomething succeeded, and result is unwrapped.