如果评估斯威夫特如何评估?
我已经看到了这个代码在Swift网站和各种职位在这里,我正在努力掌握的基本知识。 这条线是如何评估的?
if let name = optionalName {
我很困惑,因为它不是名称==可选的名称,它的分配值,那么如何报告是真实的,为什么当你用nilreplace约翰appleseed是不正确的,因为它仍然是平等的?
var optionalName: String? = "John Appleseed" var greeting = "Hello!" if let name = optionalName { greeting = "Hello, \(name)" }
基本上这句话是这样说的:“如果你可以让新的variablesname
等于optional的非可选版本,那就用它来做下面的事情。 正如马丁指出的,这被称为可选绑定 。
它的唯一目的是testing一个可选variables是否包含实际值,并将非可选forms绑定到一个临时variables。 这是“打开”一个可选的或换句话说,访问包含在可选项中的值的安全方式。 这绝不是对任何forms的平等的检验。 它只是在一个可选项中testing一个值的存在。
一个可选的要么是设定的要么是没有设定的……让我们做出一个重要的决定。 “我们应该如何编写我们的代码,使其能够在两种状态下正常工作?”。 我们打开可选的方式是为我们决定的。
有几种方法可以用来对付未设置的可选项。
- 崩溃!
- 如果未设置,则将该值默认为某个值。
- 顺利地失败,即什么都不做,而且如果这个值已经设置好了,那就分配它。
- 优雅地失败,但是, 如果值设置…做一些事情(这只是一个单一的任务)。
以下是4种方法
如果没有值,使用强制解包将会崩溃。 如果这个值是非常重要的,例如电影的标题 (每部电影都必须有一个名字),你会想要这样做。 !
用于强制解包。
movieTitle = movie.title!
使用零合并是另一种方式,可以给你更多的控制权 ,也就是说,如果没有设置值,它不会崩溃,如果没有设置,也不会“没有设置”…它会做你所说的如果没有名字设置,它会默认/设置电影名称为untitled_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
(或者是两种不同types的可选绑定的 guard
)会给你更多的控制 ,如果没有设置值,它不会崩溃。 如果这个值被设置,那么你可以做一些事情。 如果没有设置,那么你可以添加一个else
语句。
if let supportingActor = movie.supportingActor{ print(" The supporting actor is \(supportingActor)}
这是解包的最常用的方式,因为强迫解包应该有些气馁。 有关更多的讨论,为什么不鼓励在这里看到。 对于guard
和if-let
比较, if-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*
if语法接受2个不同的条件。 第二,一个可选的绑定,不是一个布尔值。 这是混乱,你可以写:
如果让name = optionalName {
但不是
if(let name = optionalName){
比较苹果文档(Swift参考):
if语句中任何条件的值必须具有符合BooleanType协议的types。 该条件也可以是可选绑定声明,如可选绑定中所述。
每当你使用弱引用,可选的types , 如果让我们安全地守护你的代码并避免崩溃,最好使用下面的例子
var middleName :String? = "some thing" if let isExistsMiddleName = middleName { // do some thing here } else { // no middle name }
if
只使用布尔expression式,除了它会抛出一个错误,所以这段代码片断说
if let name = optionalName { }else{ }
如果optionalName为零,则条件为false,否则语句将执行。 但是,如果optionalName有一些值,那么可选值将被解包/分配到常量variables中,即名称。