我对斯威夫特比较陌生。在阅读时,我发现以下示例代码用于在应用程序委托中以编程方式创建UINavigationController:

let mainVC = ViewController.init()
let nc = UINavigationController.init(rootViewController: mainVC)
self.window = UIWindow.init(frame: UIScreen.main.bounds)
self.window!.rootViewController = nc
self.window?.makeKeyAndVisible()

我的问题是关于最后一行“self.window?.makeKeyAndVisible()“。我早料到它会有用的!打开self.window,类似于上面的行,但是?被利用了。我试过这两种密码!还有那个?在这两种情况下,应用程序都已编译并成功运行。
我想知道的是哪个标点符号(!或者?)最好用,为什么?

最佳答案

如果你用?若要在对象为空时展开对象,应用程序不会崩溃。(?如果对象为零,符号将跳过展开)
如果你用的话!要打开一个对象,如果该对象为空,则应用程序将崩溃。(你用!当你期待的对象,它永远不会是零)。
请考虑以下代码段:

var tentativeVar: Array<Any>?
tentativeVar = Array()
tentativeVar?.append("FirstElement")

现在,如果您打印带有可选展开(使用?)的Tentavievar,将得到以下结果。
(lldb) po tentativeVar?[0]
 Optional<Any>
  - some : "FirstElement"

同样,如果强制展开变量,则可以直接获取忽略不必要的可选数据的对象。
(lldb) po tentativeVar![0]
"FirstElement"

对于同一个对象,如果不初始化该对象并尝试访问其中的元素,则会发生以下情况。
print("\(tentativeVar?[0])") //prints nil
print("\(tentativeVar![0])") //Crashes the app, trying to unwrap nil object.

关于ios - Swift可选的展开语法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43980387/

10-13 04:07