我已阅读 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
.您不能直接使用它,您必须先将其解包(使用 guard
、 if let
或强制解包运算符 !
)以生成 String
.只要你不强行用 !
解包它,这也是安全的。
String!
也代表一个 Optional<String>
, 可以是 nil
.然而,这个可选值可以用在需要非可选值的地方,这会导致隐式的强制展开。这就像有一个 String?
并始终使用 !
隐式地强制展开它.这些很危险,因为会出现 nil
将使您的程序崩溃(除非您手动检查 nil
)。
关于Swift 字符串 vs. 字符串!与字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37493241/