Arb*_*tur 38 optional uiwindow ios swift
访问UIapplication's主窗口时,它将作为a返回UIWindow??
let view = UIApplication.sharedApplication().delegate?.window // view:UIWindow??
Run Code Online (Sandbox Code Playgroud)
为什么它作为双重可选项返回,它是什么意思,如果放入一个if let应该添加一个!之后?
if let view = UIApplication.sharedApplication().delegate?.window!
Run Code Online (Sandbox Code Playgroud)
我的第一个问题是?用!后代表代替,但那不是解决方案.
Rob*_*ier 29
@matt有详细信息,但有一个(有点可怕,有点可怕)的解决方法.(见下面的编辑)
let window = app.delegate?.window??.`self`()
Run Code Online (Sandbox Code Playgroud)
我会将对这一行代码的理解作为读者的练习.
好吧,我说谎,让我们分解吧.
app.delegate?.window
Run Code Online (Sandbox Code Playgroud)
好的,到目前为止一切顺利.在这一点上,我们UIWindow??让我们头痛(我相信Swift和Cocoa之间的Swift脱节是一个错误).我们想要崩溃两次.我们可以使用可选的链接(?.)来做到这一点,但是它会解开和重新打包,所以我们回到了我们开始的地方.你可以使用双重可选链,但这??.很奇怪,但是很有效.
这很好,但??不是合法的后缀运算符.你必须实际上链接到某个东西.好吧,我们想要回归自己(即"身份").该NSObject协议为我们提供了一个身份的方法:self.
self是一个方法NSObject,但它也是Swift中的保留字,所以它的语法是`self`()
所以我们把疯狂放在上面.照你的意愿去做.
请注意,自从??.工作以来,您在技术上并不需要这样做.你可以接受view的UIWindow??,并用??.它喜欢view??.frame.它有点吵,但可能不会为它应该需要的少数几个地方带来任何真正的问题.
(*)我曾经认为这是Swift中的一个错误,但它不能通过可选链接直接修复.问题是没有可选的链接过去window.所以我不确定在哪里找到合适的地方.Swift可以允许后缀?- 意味着"变平"而不需要链接,但这感觉很奇怪.我想合适的操作员将是interrobang delegate?.window?:D我确信这不会引起任何混淆.
编辑:
Joseph Lord指出了更好的解决方案(这与我一直用来避免琐碎的if-let的技术非常类似,但之前没有考虑过这种方式):
let window = app.delegate?.window ?? nil // UIWindow?
Run Code Online (Sandbox Code Playgroud)
我同意他的看法,这是正确的答案.
mat*_*att 17
这是因为该window物业本身存在疑问(可选).因此,您需要一个问号因为可能存在或不存在窗口属性,而另一个问号是因为该窗口属性的返回值本身是可选的.因此,我们得到一个双重包装的可选(正如我在我的教程中解释的那样:向下滚动到提示框,我在其中讨论当可选属性具有Optional值时会发生什么).
因此,为了表达这一个办法是分两个阶段-一个投(和解开那可选),以及一个获取窗口(并解开那可选):
if let del = UIApplication.sharedApplication().delegate as? AppDelegate {
if let view = del.window {
Run Code Online (Sandbox Code Playgroud)
现在view是一个UIWindow.
当然,如果你确定你的地面(你可能是你的地面),你可以强制第一行中的强制转换和第二行中的展开.所以,在Swift 1.2中:
let del = UIApplication.sharedApplication().delegate as! AppDelegate
let view = del.window!
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4271 次 |
| 最近记录: |