当前位置: 首页 > 面试题库 >

为什么double类型的主窗口是可选的?

饶骁
2023-03-14
问题内容

访问UIapplication's主窗口时,它将作为UIWindow??

let view = UIApplication.sharedApplication().delegate?.window // view:UIWindow??

为什么它返回为double可选,这是什么意思?如果放入a中if let,我应该!在其后添加一个?

if let view = UIApplication.sharedApplication().delegate?.window!

尽管我的第一个建议是替换?!after委托,但这不是解决方案


问题答案:

@matt有详细信息,但是有一个(有点可怕,有点很棒)的解决方法。(不过请参见下面的编辑)

let window = app.delegate?.window??.`self`()

我会将对这一行代码的理解留给读者作为练习。

好吧,我撒谎,让我们分解一下。

app.delegate?.window

好的,到目前为止很好。在这一点上,我们感到UIWindow??头痛(我相信这是Swift和Cocoa之间的Swift断开连接中的 错误
)。我们要折叠两次。我们可以使用可选的链接(?.)来做到这一点,但是可以解包和重新包装,因此我们回到了起点。您可以使用double-optional-
chain,虽然??.很奇怪,但是可以使用。

很好,但??不是合法的后缀运算符。您实际上必须链接到某个东西。好吧,我们想重新链接到自身(即“身份”)。该NSObject协议为我们提供了一种身份验证方法:self

self是上的方法NSObject,但在Swift中也是保留字,因此其语法为`self()`

这样我们就可以疯狂起来。随便使用它。

请注意,既然??.可以使用,从技术上讲您就不需要此。你可以接受viewUIWindow??,并使用??.它像view??.frame。这有点嘈杂,但可能不会在需要的几个地方造成任何实际问题。

(*)我曾经将其视为Swift中的错误,但无法通过可选链直接修复。问题是没有可选的链接过去window。因此,我不确定在哪里进行修复。Swift可以?在不需要链接的情况下允许postfix-
表示“扁平化”,但这听起来很奇怪。我猜正确的运算符应该是interrobang delegate?.window‽:D我敢肯定这不会引起任何混乱。

编辑:

约瑟夫·洛德(Joseph
Lord)指出了更好的解决方案(与我一直在使用的避免琐碎if-
let的技术非常相似,但之前从未想到过这种方法):

let window = app.delegate?.window ?? nil // UIWindow?

我同意他的看法,这是正确的答案。



 类似资料:
  • 问题内容: 我读苹果文档 ,当我发现这句话: 本类仅包含一个属性:。 此属性存储对应用程序窗口的引用。此窗口表示应用程序视图层次结构的根。这 是绘制所有应用程序内容的地方。请注意,window属性是 可选的 ,这意味着 在某些时候它可能没有任何值(为nil ) 。 我不明白的是:为什么此属性有时可能为零? 变成零的情况是什么? 问题答案: 当您关闭应用程序时,您的应用程序仍可以接收静默通知 或在后

  • 问题内容: 它以空字符串开头,而不是nil。即使将其显式设置为nil,它仍然是一个空字符串。我不明白 也许通过分配nil使其易于清除?用它编写代码很麻烦。 问题答案: 这是历史性的事情。空字符串和字符串之间没有任何区别。在Objective- C中,无需在两者之间进行区别,因为您可以在Objective-C中调用方法。 同样,在Objective-C中也无法阻止用户分配给属性。生成的合同可以是可选

  • 我在Haskell中进行了测试。 这里浮点类型的精度是6位。而双精度类型的精度是15位。双精度类型的精度显然是浮点类型的两倍多。说双精度类型是浮点类型精度的两倍还正确吗?

  • 我们知道我们可以将null赋给可为null的类型。例如: 我们知道第二种说法是有效的,因为有人告诉我们它是有效的,我们只是接受它,而不问为什么。但如果查看的源代码,则为: 我们可以将赋给为的原因是由于隐式运算符,它允许您隐式强制转换int为。根据隐式运算符的规则,作为的右手边,必须是结构类型,但显然不是合法的结构值,那么如何做(更不用说本身就是一个结构),为什么不违反隐式运算符规则

  • 问题内容: 运行以下代码: 结果是: 上面的代码中没有定义任何窗口框架,它看起来默认的窗口框架是 不确定我对默认窗口框架的理解是否正确 问题答案: 从Spark Gotchas 默认帧规格取决于给定窗口定义的其他方面: 如果指定了ORDER BY子句,并且该函数接受了帧规范,则该帧规范是由RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW定义的, 否

  • 问题内容: 为什么Math.max的实现不是可变函数? 可以这样实现: 没有任何理由为什么不能这样实现? 问题答案: 尽管其他人已经回答了为什么不是可变参数的问题,但他们没有回答为什么引入可变参数功能时不会创建这种方法的原因。 我什至不知道(有一个开放的bug报告),所以我只能猜测: 的确没有在中实现它,但是如果我们研究以下方法: 尽管类型签名看起来很丑陋(它必须足够灵活以处理协方差和协方差),但