也许我还很困惑。我以为我理解了基本概念,但是在 xcode 中玩耍时,我没有得到我认为应该做的事情 采取以下代码
var title: String? = "hello world"
println("\(title)")
我认为这会给我一个错误,因为我认为应该必须解开标题,因为我正在访问它,但它似乎编译得很好。有人可以对此有所了解。
也许我还很困惑。我以为我理解了基本概念,但是在 xcode 中玩耍时,我没有得到我认为应该做的事情 采取以下代码
var title: String? = "hello world"
println("\(title)")
我认为这会给我一个错误,因为我认为应该必须解开标题,因为我正在访问它,但它似乎编译得很好。有人可以对此有所了解。
可选项是Printable
s,这意味着您可以将它们打印到输出流(此处为控制台)。Optional("hello world")
您应该在控制台中看到类似的东西,而不是hello world
所有可选的是,如果它为 nil,则应用程序不会崩溃。如果你把消除标记,并且没有分配一个值,它会崩溃。
在 if 语句中,您可以检查变量是否为 nil:
if (title == nil) {
//this works
}
var title: String? = "hello world"
println("\(title)") // This would print out Optional(Title)
var title2: String! = "hello world"
println("\(title2)") // This would print in Title
可选的,当它们在没有值的情况下执行时不会导致您的程序崩溃,但 !(variable) 如果它们没有值将导致您的代码崩溃。
如上所述,可选项表示允许常量或变量“无值”。可以使用 if 语句检查可选项以查看值是否存在,并且可以使用可选项绑定有条件地解包以访问可选项的值(如果确实存在)。
根据文档,您的声明将转换为
var title: Optional<String> = Some("hello world").
从 Apple 文档中,可选的是
enum Optional<A> {
case Nil
case Some(A)
}
因此,当您将值传递给可选时,在声明时,编译器会理解,它有一个值,这就是它没有显示错误的原因。
但是,如果您执行以下代码,您可能会得到不同的结果。
var title: String? = "hello world"
title = nil
println("\(title)")
它将在操场上打印“nil”。
Based on apple doc
The concept of optionals doesn’t exist in C or Objective-C. The nearest thing in Objective-C is the ability to return nil from a method that would otherwise return an object, with nil meaning “the absence of a valid object.” However, this only works for objects—it doesn’t work for structures, basic C types, or enumeration values. For these types, Objective-C methods typically return a special value (such as NSNotFound) to indicate the absence of a value. This approach assumes that the method’s caller knows there is a special value to test against and remembers to check for it. Swift’s optionals let you indicate the absence of a value for any type at all, without the need for special constants.
Example
let possibleString: String? = "An optional string."
let forcedString: String = possibleString! // requires an exclamation mark
let assumedString: String! = "An implicitly unwrapped optional string."
let implicitString: String = assumedString // no need for an exclamation mark