【问题标题】:Why do I need to wrap this line in an exclamation? swift 3为什么我需要用感叹号换行?迅速 3
【发布时间】:2017-06-24 21:30:12
【问题描述】:
if (tweet?.media.count)! < 0

Tweet 是一个可选类型的 Tweet 类

媒体的类型为 [mediaitem]

count 是 Int 类型

那我为什么需要感叹号呢?

【问题讨论】:

  • optional chaining 表达式返回一个可选值,因为您无法将 Optional 与 Int 进行比较,您需要将其解包。
  • “那我为什么需要感叹号呢?” 所以当tweet 是nil 时,你可以有幸看到你的应用崩溃。 :)
  • 那么为什么它不再给我一个错误了? if tweet?.media.count == 0 { return "" } else { return "Images" }
  • 请不要在 cmets 中发布代码。 Edit您的问题,如果您有其他信息。
  • @DewTime:您可以测试 equality (== 0) 的可选值,但不能在 Swift 3 中比较它们 (stackoverflow.com/questions/39251005/…。

标签: swift optional


【解决方案1】:

由于tweet 是可选的,它的值可能是nil。使用可选链(tweet 和media 之间的?. 运算符)意味着表达式的其余部分也可能是nil——毕竟,不可能获得非nil 的媒体项数组来自nil 推文。

然后,在表达式的末尾,您会得到一个可选的 Int,它不能直接与 0 比较。这就是编译器建议您使用 ! 运算符强制解包计数的原因。

我个人认为有更好的方法 - 可以预先检查 tweet 是否为 nil,而不是强制展开:

if let tweet = tweet, tweet.media.count < 0 {
    // …
}

像这样使用if let 只会在tweet 不是nil 的情况下继续使用条件。然后,在下面的表达式中,您可以使用展开的非可选推文进行其余的计算。

【讨论】:

  • 我希望 Xcode 停止推荐 ! 运算符。在 SO 上发布的关于由于强制展开导致崩溃的 Swift 问题将减少 5,000 个。
  • 好吧,现在无论出于什么原因,xcode 都不再强迫我这样做了。我去掉了感叹号,它让我编译。我不明白为什么有时它'告诉我做某事然后就可以了。
猜你喜欢
  • 2020-05-30
  • 1970-01-01
  • 1970-01-01
  • 2011-01-11
  • 1970-01-01
  • 2011-12-22
  • 2018-11-14
  • 2011-05-21
相关资源
最近更新 更多