gpt4 book ai didi

ios - 在 Swift 中使用 if let 语法解包双可选(类型??)?

转载 作者:可可西里 更新时间:2023-11-01 01:37:54 26 4
gpt4 key购买 nike

<分区>

如果我尝试编译以下代码,它将在 print 上失败行。

func foo(application: UIApplication) {
if let window = application.delegate?.window {
print(window.frame) // SYNTAX ERROR
}
}

原因是window的类型是UIWindow? , 不是 UIWindow :

error: value of optional type 'UIWindow?' not unwrapped; did you mean to use '!' or '?'?

我可以通过这样做来修复它:

func foo(application: UIApplication) {
if let window = application.delegate?.window {
if let window = window {
print(window.frame)
}
}
}

但是,这会增加更多的代码行,而且似乎没有必要这样做。我以为 if let <variable> = <value>应该只在 window 时执行它的主体被发现不是nil .

换句话说,我希望它会使用这种逻辑:

  • 如果application.delegate = nil , 不要执行该 block 。
  • 如果application.delegate.window = nil , 不要执行该 block 。
  • 如果application.delegate.window != nil ,执行 block 并允许我使用 window作为非可选 UIWindow .

为什么是if let window = application.delegate?.window定义 window作为可选?有什么方法可以通过添加少量代码或不添加代码来使它的行为像上面的第二个片段一样?

注意:我不想使用 print(window?.frame)因为打印只是一个例子。我实际上有更多的代码并且不想使用空对象模式。我希望它真的被定义为非可选的。

更新:如果我使用 let test = application.delegate?.window ,我看到类型是 UIWindow?? , 或双可选。这解释了为什么我确实需要第二个 let 语句。所以我想我现在的问题是解包双可选的最简洁的方法是什么?

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com