If statement 如果让我们评估,Swift是怎样的?

If statement 如果让我们评估,Swift是怎样的?,if-statement,swift,If Statement,Swift,我在Swift网站和这里的各种帖子上看到了这段代码,我正在努力掌握基本知识。这条线是如何评估的 if let name = optionalName { 我很困惑,因为它不是name==可选名称,而是赋值,那么如何报告true和 为什么当你用零替换约翰·阿普尔赛德时,它仍然是相等的呢 var optionalName: String? = "John Appleseed" var greeting = "Hello!" if let name = optionalName { gree

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

if let name = optionalName {
我很困惑,因为它不是name==可选名称,而是赋值,那么如何报告true和 为什么当你用零替换约翰·阿普尔赛德时,它仍然是相等的呢

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

基本上,这句话是这样说的,“如果您可以让新变量
name
等于
optionalName
的非可选版本,请对其执行以下操作”。正如马丁所指出的,这被称为


它的唯一目的是测试可选变量是否包含实际值,并将非可选表单绑定到临时变量。这是“展开”可选项的安全方法,或者换句话说,访问可选项中包含的值。这绝不是对任何平等的检验。它只测试可选项中是否存在值。

if语法接受两种不同的条件。第二个是可选绑定,不是布尔值。正如您所写,这令人困惑:

if let name = optionalName {
但不是

if (let name = optionalName) {
苹果(Swift参考):

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


每当您使用弱引用时,最好使用可选类型if-let来保护代码并避免崩溃 下面是一些例子

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

如果
只接受布尔表达式,那么它会抛出一个错误,因此下面的代码片段

if let name = optionalName {

}else{

}

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

可选值要么设置要么未设置(不是nil或nil)…留给我们一个重要的决定。“我们应该如何编写代码,使其在两种状态下都能正常工作?”。我们打开可选文件的方式决定了这一点

有几种方法可用于对抗非可选设置

  • 撞车
  • 如果未设置,则默认值为某物
  • 优雅地失败,即什么也不做,但如果设置了值,则分配它
  • 优雅地失败,即什么也不做,但是如果设置了值…做点什么(这不仅仅是一个赋值)
以下是4种方法


如果没有值,则使用将崩溃。如果具有该值非常重要,例如电影的标题(每部电影必须有一个名称),则您可能希望这样做<代码>用于强制展开

movieTitle = movie.title!

使用是另一种方法,它将为您提供更多的控制,这意味着如果未设置值,它不会崩溃,如果未设置,它也不会“不设置任何内容”…它将执行您告诉它执行的操作,例如,如果未设置名称,它将默认/设置电影名称为untitled\u movie<代码>??用于零聚结

var movieTitle = movie.title ?? "untitled_Movie"

如果没有值,则使用将不起任何作用,如果有值,则将设置值。您这样做是为了设置其值并不重要的事情,例如,对于参与者代理的名称。
用于可选链接

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
这两种不同类型的)将为您提供更多的控制,如果未设置该值,则不会崩溃。如果设置了该值,则可以执行某些操作。如果未设置,则可以添加
else
语句

if let supportingActor = movie.supportingActor{
print(" The supporting actor is \(supportingActor)}
这是最常用的展开方式,因为有些人不鼓励强制展开。有关为什么不鼓励的更多讨论,请参阅。有关
guard
if之间的良好比较,请参见


旁注:

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

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*
 

查找Swift文档中的“可选绑定”…详细查看了选项,if let
语法称为可选绑定。当我开始讨论时,我会读一读,我只是在Swift简介的开头,它没有解释它。你的解释很有道理,谢谢。为什么我们不使用“!=”而不是“if let”来检查可选变量是否有-if optionalName!=nil{greeting=“Hello,(name)”}@Nuibb,因为在使用
if let
时,我们将值绑定到一个非可选变量(
name
,在本例中)。您的示例无法编译,因为现在没有名为
name
的变量。如果您将示例更改为使用
optionalName
,它将打印为
Hello,Optional(“John Applesed”)
。在检查nil
Hello,\(optionalName!)
后,可以使用强制展开,但如果不进行检查就将代码段移动到某个位置,则更容易出错。既然电影字幕永远只能是字符串,为什么不鼓励强制展开呢,所有的字符串对电影都有效吗?(我不想要“无标题电影”我想要“”)对于这种情况,强制展开是唯一正确的方法,如果您可以删除“强制展开有点不被鼓励”的部分,那就太好了假设你打了一个网络电话,服务器团队的某个开发人员做了一个错误的决定,忘记了发送电影标题。你想让你的应用程序在生产中崩溃吗?还是只写未知的标题?事实上,IMDb上的一些电影没有标题:)。另外,强制展开意味着您尚未进行任何日志记录或断言。那太糟糕了。因为你不知道根本原因是什么。这是一个稻草人的论点,我从来没有说过“总是使用强制展开”。只是因为你不应该使用强制展开