Swift 字符串 vs. 字符串!与字符串?

标签 swift option-type type-safety

我已阅读 this问题和其他一些问题。但它们与我的问题

有些无关

对于 UILabel 如果你不指定 ?! 你会得到这样的错误:

@IBOutlet property has non-optional type 'UILabel'

然后 Xcode 给你 2 个选择来修复它,你可以这样做:

fix-it Add ? to form the optional type UIlabel?
fix-it Add ! to form the implicitly unwrapped optional type UIlabel?

然而,对于字符串,您可以只键入 string 而无需 ?! 并且您不会收到错误消息 这是为什么?

如果未设置 name 会怎样?然后我们会有一个 nil 没有使用 ?!Swift 所有关于满足“类型安全” '?

示例:

struct PancakeHouse {
  let name: String // this doesn't have '?' nor '!'
  let photo: UIImage?
  let location: CLLocationCoordinate2D?
  let details: String
}

我的主要困惑是我们什么时候不想使用可选?

最佳答案

所有这些都包含在文档中:The Swift Programming Language - The Basics .

简而言之:

String代表 String保证存在。这个值不可能为零,因此直接使用是安全的。

String?代表 Optional<String> , 可以是 nil .您不能直接使用它,您必须先将其解包(使用 guardif let 或强制解包运算符 ! )以生成 String .只要你不强行用 ! 解包它,这也是安全的。

String!也代表一个 Optional<String> , 可以是 nil .然而,这个可选值可以用在需要非可选值的地方,这会导致隐式的强制展开。这就像有一个 String?并始终使用 ! 隐式地强制展开它.这些很危险,因为会出现 nil将使您的程序崩溃(除非您手动检查 nil)。

关于Swift 字符串 vs. 字符串!与字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37493241/

相关文章:

ios - 保持更新的模型类并从 Swift 中的多个 View Controller 访问它?

ios - Heyzap Ad Mediation,仅适用于 rootviewcontroller

java - Java 中的可选条件运算符导致 NullPointerException

javascript - 如何创建一个可选组,但该组是否存在与我的正则表达式最匹配?

C#:整数集的类型安全(例如枚举)

ios - defer 语句的不同行为

ios - 如何使用 DynamoDB AWS 创建聊天线程?

Swift 在 convenience init 中解包可选的 init

haskell - 让 GHC 在 `KnownNat` 上应用基本数学定律

c++ - 在不使用额外类的情况下在 C++ 中实现类型安全