Swift 可选变量a是怎样的;强大的解决方案;?

Swift 可选变量a是怎样的;强大的解决方案;?,swift,Swift,我在想,根据可选变量苹果公司的说法,这个“强大的解决方案”实际上是如何强大的,若它是我们在Obj-c中已经拥有的东西的话 var mystring: String? = nil if mystring { //string is not nil } 第二个场景无法编译 var mystring: String = nil if mystring { //string is not nil } 我们以前可以在Obj-C中这样做,而无需任何额外设置 NSString * somest

我在想,根据可选变量苹果公司的说法,这个“强大的解决方案”实际上是如何强大的,若它是我们在Obj-c中已经拥有的东西的话

var mystring: String? = nil

if mystring {
  //string is not nil
}
第二个场景无法编译

var mystring: String = nil

if mystring {
  //string is not nil
}
我们以前可以在Obj-C中这样做,而无需任何额外设置

NSString * somestring = @"Test";

if(something != [NSNull null]){
  //Do something.
} 

所以我真的很困惑,如果它在以前的语言中已经存在的话,它是如何像他们声称的那样强大


Swift选项可让您明确变量是否可以为
nil
,而Objective-C则完全用于猜测游戏。减少关于
EXC\u BAD\u访问错误的噩梦。这就是力量所在。

在Objective-C中,指向对象的指针可以是
nil
,是的。但是没有强制执行
nil
是否有意义

NSString *shouldNeverBeNil = @"a string!";
shouldNeverBeNil = nil;
NSLog("Hello, %@", shouldNeverBeNil); // "Hello, "
在ObjC中,这可以很好地编译,尽管我们永远不应该对任何东西打招呼。那是一只虫子

但是,如果我们在Swift中也这样做,它甚至不会编译,也不会出现运行时错误

var shouldNeverBeNil: String = "a string!"
shouldNeverBeNil = nil; // Compilation error.
NSLog("Hello, %@", shouldNeverBeNil); // never happens
选项允许您将变量设置为
nil
。编译错误总是优于运行时错误,因为应用程序的最终用户不可能遇到编译错误

如果您希望允许该值为
nil
Swift,则作为可选值,Swift会显式地为其祝福。现在,如果它是
nil
,则明确允许它,Swift提醒您处理代码中的
nil
大小写和值大小写

var okToBeNil: String? = "a string!"
okToBeNil = nil;
if okToBeNil != nil {
  NSLog("Hello, %@", okToBeNil!); // never happens
} else {
  NSLog("What is your name?")
}

可选的是一个单独的类型(实际上是一个枚举),它可以容纳2个值:

  • 可选项用于的类型的实际实例/值(对应于
    Some
    enum案例)
  • 一个
    nil
    值(对应于
    None
    enum案例),表示没有值
与Objective等其他语言的不同之处在于,optionals不使用有效的类型值,在某些情况下,类型值可能有意义,而在其他情况下,类型值可能有不同的意义

在目标C中,引用类型的缺失由
nil
表示,它实际上是指向位置0x00000000的指针(在32位场景中)

根据惯例,通常不存在值类型。返回整数的函数可以将-1定义为无值,但-1本身是整数,如果该函数可以返回负值,则不能使用它

相反,在Swift中,可选项可以具有有效的整数值,也可以具有
None
,后者本身不是整数(也不是类、结构或与可选项一起使用的任何类型的实例)

另外,更重要的是,您不能将
nil
赋值给非可选变量
——这会导致编译错误,从而避免了许多通常在运行时发现且通常难以追踪的常见错误


最后,在objective C中,可以对引用类型使用
nil
,但不能对值类型使用(如上所述,对于整数类型)。在swift中,无论所包含的类型如何,可选值都可以为零,因此
Int?
可以是整数,也可以是
nil

您是否有特定的编程问题,或者您只是不同意苹果的用词选择?将对象与
[NSNull]
进行比较几乎总是错误的,无论它是否为
nil
。(除非您使用空值解析JSON,或者比较
if([NSNull-null]==[NSNull-null]
,这也是毫无意义的。)@0O0O0O0O0不,他们的话没问题……这是一个合理的问题,因为我想知道Swift有多强大。到目前为止,我一直喜欢Swift,只是缺乏思考,或者我找不到正确的信息,这让我很难弄清楚。例如,我得到属性列表,并得到它们的名称用于JsonMapping。你说的“强大”是什么意思?基本上,现在的问题是,他们认为使用Optionals可以在一定程度上防止运行时错误,这对他们来说是很强大的(我同意,但这显然有待讨论).Swift作为一种语言是一个需要讨论的更广泛的问题,但我个人认为Optionals有助于使Swift成为一种更好的语言。你是对的。由于一些同事的回答,没有任何争论。使用“Strong”我指的是Optionals和运行时错误保护,就像你提到的。我以前不知道。这不会崩溃:
[shouldNeverBeNil length];//运行时崩溃!
更好的例子:
[someMutableArray addObject:shouldNeverBeNil]
。因此,强大的部分在于,它变成了编译错误而不是运行时错误,如果出现运行时错误,是因为程序员错误地决定将变量作为可选变量。现在感谢您,这是有意义的。@AlexWayne将
nil
发送到字符串格式化程序不会自动失败。在您的e例如,输出是
Hello,(null)
。也许您可以用一个代码示例来详细说明。几行代码可以说一千个单词。
var okToBeNil: String? = "a string!"
okToBeNil = nil;
if okToBeNil != nil {
  NSLog("Hello, %@", okToBeNil!); // never happens
} else {
  NSLog("What is your name?")
}