Swift 'if let'是如何计算的?

ua4mk5z4  于 2023-03-17  发布在  Swift
关注(0)|答案(6)|浏览(144)

我在Swift网站和这里的各种帖子上看到了这段代码,我正在努力掌握基本知识。这行代码是如何求值的?

if let name = optionalName {

我很困惑,因为它不是name ==可选的name,它是赋值的,那么这怎么会报告为真,为什么当你用nil替换john appleseed时它不为真,因为它仍然是相等的?

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

nmpmafwu1#

实际上,这一行是在说,“如果你能让新变量name等于optionalName的非可选版本,那么就用它做下面的事情”,正如Martin所指出的,这叫做可选绑定。
它的唯一目的是测试可选变量是否包含实际值,并将非可选形式绑定到临时变量。这是“展开”可选变量或换句话说,访问可选变量中包含的值的安全方法。它绝不是测试任何类型的相等性。它只是测试可选变量中是否存在值。

tcomlyy6

tcomlyy62#

一个可选项要么设置要么不设置(不是nil或nil)......留给我们一个重要的决定。“我们应该如何编写代码,使它能够正确地工作2两种状态?"。我们 * 展开 * 可选项的方式是什么决定我们。
有几种方法可以用来对抗未设置的可选项。

  • 崩溃!
  • 默认值为某个值-如果未设置。
  • 优雅地失败,即什么也不做,但也 * 如果 * 值已设置,然后分配它。
  • 优雅地失败,即什么也不做,但是 * 如果 * 值被设置...做一些事情(它只是一个以上的单一分配)。

以下是4种方法
使用forced unwrapping将崩溃如果你没有一个值。你会希望这样做,如果有一个值是至关重要的,如 * 标题的电影 *(每部电影必须有一个名称)。!是用于强制展开。

movieTitle = movie.title!

使用nil合并是另一种方式,它将给予你更多的控制,这意味着它不会崩溃,如果值没有设置,也不会“不设置它什么都没有”,如果它没有设置...它会做你告诉它做什么,例如,它会默认/设置 * 电影的名称为untitled_movie*,如果没有名称设置。??用于nil合并。

var movieTitle = movie.title ?? "untitled_Movie"

使用optional Chaining不会做任何事情如果你没有一个值,并将设置值如果你有一个值。你这样做的东西,有它的值设置是 * 不 * 至关重要的,例如 * 你的演员的代理人的名字 *。?是用于可选的链接。

let agent = movie.leadActor?.agent //would not crash if you don't have a lead actor (optional chaining)
let agent = movie.leadActor!.agent //would crash if you don't have a lead Actor (forced wrapping)

使用if-let(或guard,这是两种不同类型的optional binding)将给予你更多的控制,如果没有设置值,它不会崩溃。如果设置了值,那么你可以做一些事情。如果没有设置,那么你可以添加一个else语句。

if let supportingActor = movie.supportingActor{
print(" The supporting actor is \(supportingActor)}

这是最常用的展开方式,因为不鼓励强制展开。有关不鼓励强制展开的原因的详细讨论,请参阅here。有关guardif-let之间的良好比较,请参阅guard vs. if-let

附注:

可选绑定和可选链接通常一起使用:

if let agent = movie.leadActor?.agent {
ContactInfo = agent.phoneNumber
} // if-let is the optional *binding* part, the movie dot leadActor dot is the optional *chaining*
imzjd6km

imzjd6km3#

if语法接受两个不同的条件。第二个条件是可选的绑定,它不是布尔值。这很容易让人混淆,你可以这样写:

if let name = optionalName {

但不是

if (let name = optionalName) {

苹果documentation(Swift参考):

  • condition* 的值必须是Bool类型或桥接到Bool的类型。条件也可以是可选绑定声明,如可选绑定中所述。
wvmv3b1j

wvmv3b1j4#

if只接受布尔表达式,除此之外,它会抛出一个错误,所以这个代码片段说

if let name = optionalName {

}else{

}

如果optionalName为nil,则条件为false,else语句将执行。但是,如果optionalName有一些值,则可选值被展开/赋值到常量变量ie name中。

tpgth1q7

tpgth1q75#

无论何时使用 * 弱引用、可选类型 *,最好使用 if let 来保护代码并避免崩溃

var middleName :String? = "some thing"
if let isExistsMiddleName = middleName {
// do some thing here
} else {
// no middle name
}
lymnna71

lymnna716#

ABAP对此有更好的实现。如果optionalName不是首字母。//打印包含姓名问候语

相关问题