为什么我会使用if和let,而不仅仅是检查原始变量是否为零?(迅速)

het*_*lek 5 swift

"The Swift Programming Language."一书中,Apple提到在访问可选变量时使用iflet一起使用.

本书给出了以下代码:

var optionalString: String? = "Hello"
optionalString == nil

var optionalName: String? = "John Appleseed"
var greeting = "Hello!"
if let name = optionalName {
    greeting = "Hello, \(name)"
}
Run Code Online (Sandbox Code Playgroud)

使用的优势是什么if let name = optionalName,而不是if optionalName != nil(并且总是称之为optionalName)?有什么区别,还是仅仅是惯例?

myt*_*thz 12

因为它还解包了可选值,所以这段代码:

if let name = optionalName {
    greeting = "Hello, \(name)"
}
Run Code Online (Sandbox Code Playgroud)

相当于:

if optionalName != nil {
    let name:String = optionalName!
    greeting = "Hello, \(name)"
}
Run Code Online (Sandbox Code Playgroud)

这种语言糖在Swift中称为Optional Binding.

可选类型

在夫特TT?不同类型的,但可选的基础值T?可以很容易地通过使用能够实现类型!后缀操作符,例如:

let name:String = optionalName!
Run Code Online (Sandbox Code Playgroud)

现在可以在String预期的地方使用,例如:

func greet(name:String) -> String {
    return "Hello, \(name)"
}

greet(name)
Run Code Online (Sandbox Code Playgroud)

虽然这样做是安全的,但Swift确实允许你隐式转换为可选类型:

let name = "World"
let optionalName: String? = name

func greet(optionalName:String?) -> String? {
    if optionalName != nil {
        return "Hello, \(optionalName)"
    }
    return nil
}

//Can call with either String or String?
greet(optionalName)
greet(name)
Run Code Online (Sandbox Code Playgroud)

  • 如果你想在它需要展开的值的地方使用它,即`T`和`T?`不是相同的类型. (2认同)
  • @mythz你应该把这个评论添加到你的答案中."T"与"T"的概念非常重要 (2认同)