在Swift中使用可选值

时间:2014-06-04 05:57:15

标签: ios cocoa swift

在阅读The Swift Programming Language时,我遇到了这个片段:

  

您可以使用如果一起使用可能的值   失踪。这些值表示为选项。可选值   要么包含值,要么包含nil以指示该值   失踪。在要标记的值的类型后面写一个问号(?)   该值为可选。

// Snippet #1
var optionalString: String? = "Hello"
optionalString == nil

// Snippet #2     
var optionalName: String? = "John Appleseed"
var greeting = "Hello!"
if let name = optionalName {
    greeting = "Hello, \(name)"
}

Snippet#1足够清晰,但是在Snippet#2中发生了什么?有人可以分解并解释吗?它只是使用if - else块的替代方法吗? let在这种情况下的确切作用是什么?

我确实阅读了this页面,但仍然有点困惑。

3 个答案:

答案 0 :(得分:7)

if let name = optionalName {
   greeting = "Hello, \(name)"
}

这有两件事:

  1. 检查optionalName是否有值

  2. 如果确实如此,它会解开"该值并将其分配给名为name的String(仅在条件块内部可用)。

  3. 请注意,name的类型为String(不是String?)。

    如果没有let(即只有if optionalName),只有存在值时它才会进入块,但您必须手动/显式访问String { {1}}。

答案 1 :(得分:4)

// this line declares the variable optionalName which as a String optional which can contain either nil or a string. 
//We have it store a string here
var optionalName: String? = "John Appleseed"

//this sets a variable greeting to hello. It is implicity a String. It is not an optional so it can never be nil
var greeting = "Hello!"

//now lets split this into two lines to make it easier. the first just copies optionalName into name. name is now a String optional as well.
let name = optionalName

//now this line checks if name is nil or has a value. if it has a value it executes the if block. 
//You can only do this check on optionals. If you try using greeting in an if condition you will get an error
if  name{
    greeting = "Hello, \(name)"
}

答案 2 :(得分:3)

String?是一个盒装类型,变量optionalName包含String值或不包含任何内容(即nil)。

if let name = optionalName是一个习惯用法,它会将optionalName中的值取消装箱并将其分配给name。同时,如果名称为非nil,则执行if分支,否则执行else分支。