【问题标题】:!? Strange double unwrapped optional syntax in for_in []?!? for_in [] 中奇怪的双解包可选语法?
【发布时间】:2015-01-31 02:43:25
【问题描述】:

之前我发现了一个question,但答案引出了另一个问题。是什么 !?语法,我在其他任何地方都没有见过,但这是我可以编译代码的唯一方法。谁能告诉我什么“!?”语法是什么意思?它是一个错误吗?该链接显示所有代码。

field.superview!?.superview?.layer.borderWidth = 2

【问题讨论】:

  • 我可以解释一下,但是你得到的代码太糟糕了,看起来不值得。最好把代码写得更好。
  • 那段代码不好?
  • 在各个方面。如果您正在尝试这样做,那么这不是到达警报视图本身的正确方法。它在需要施放时不施放。它试图在一行中包含太多内容,而没有澄清正在发生的事情。这简直是​​疯了。这就是为什么你最终得到双重可选的原因。
  • 加上你在原始代码中所做的事情是错误的。这不应该是 UIAlertController。如果您想完全控制您的视图,请编写您自己的视图控制器。这很容易做到。您对所有这些文本字段所做的事情没有任何借口。
  • 所以你真的只是在问语法吗?然后学习斯威夫特。如果你阅读我的 Swift 教程,你可以很容易地弄清楚。您需要了解两件事:OptionalsAnyObject

标签: swift syntax optional


【解决方案1】:

UIAlertController 的textFields 属性是[AnyObject]?。所以这就是你正在做的事情:

let textFields : [AnyObject]? = [UIView()] // textFields is an Optional
for field in textFields! { // you unwrap the Optional, but now...
    // ... field is an AnyObject
    let v1 = field.superview // now v1 is a UIView?!
}

你看到问题了吗? AnyObject 没有 superview 属性 - 或任何其他属性。 Swift 将允许这样做,但只是以将结果包装在 Optional 中为代价,因为这可能不是 UIView,因此它可能不会响应 superview(正如我解释的 here)。所以现在它会为你调用superview。但是superview 本身会产生一个 Optional(因为,如果这是一个 UIView,它可能没有超级视图)。因此是双重可选。

但如果你一开始就进行演员表,那就不会发生了:

for field in textFields as [UIView] {

现在field 是一个UIView,向它发送superview 消息是合法的,您只需要处理每个superview 的单个解包。

【讨论】:

  • 这很有意义。感谢您抽出宝贵时间。我没有意识到它是 [AnyObject]?以为是[UITextField]?我认为返回一组 textFields 的 API 会强制转换它们,但我想我应该更仔细地查看文档。我会检查自定义警报视图,感谢您的帮助。
  • “我认为返回一个文本字段数组的 API 会强制转换它们” 是的,这是一个公平的观点。但在重写 API 之前,这不是现实。在这里查看我的评论:apeth.com/swiftBook/…
  • @matt 你能解释一下吗? UIApplication.sharedApplication().delegate!.window!?.rootViewController
  • 是的,即使我现在也可以 :) 如果有人对这里感兴趣,那就是[stackoverflow.com/questions/29920427/…
  • 实际上,这个问题在这里回答了它,@beretis。情况完全一样。
猜你喜欢
  • 1970-01-01
  • 2014-10-06
  • 1970-01-01
  • 2014-07-26
  • 1970-01-01
  • 1970-01-01
  • 2013-09-05
  • 2017-12-06
  • 1970-01-01
相关资源
最近更新 更多