我在想这个"强大的解决方案"根据可选变量的苹果,它实际上是强大的,如果它是我们已经在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.
}
或
NSString * anotherstring = nil;
if(anotherstring == [NSNull null]){
//display error.
}
所以我真的很困惑这是如何强大,因为他们声称它已经存在于以前的语言。
答案 0 :(得分:4)
可选是一个类型(实际上是枚举),它可以包含2个值:
Some
枚举案例)nil
值(对应于None
枚举案例),表示缺少值与ObjectiveC等其他语言的区别在于,选项不使用有效的类型值,在某些情况下可能具有意义,而在其他情况下具有不同的含义。
在目标C中,缺少引用类型由nil
表示,它实际上是指向位置0x00000000的指针(在32位方案中)。
缺少值类型通常是按惯例。返回整数的函数可以将-1定义为缺少值,但-1本身就是一个整数,如果函数可以返回负值,则不能使用它。
在Swift中,可选的可以有一个有效的整数值,或None
,不本身就是一个整数(也不是类,结构或任何类型的实例)与可选项一起使用。
此外,更重要的是,您无法将nil
分配给非可选变量 - 这会导致编译错误,从而防止通常在运行时发现的许多常见错误,并经常很难追查。
最后,在目标C中,您可以将nil
用于引用类型,但不能用于值类型(如上所述的整数类型)。在swift中,无论包含的类型是什么,可选的都是nil - 因此Int?
可以是整数或nil
。
答案 1 :(得分:1)
使用Swift选项可以使显式变量是nil
,而Objective-C是猜测游戏的全部。减少关于EXC_BAD_ACCESS
错误的噩梦。这就是权力所在。
答案 2 :(得分:-1)
在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
Optionals允许你保佑变量nil
。编译错误总是优于运行时错误,因为应用程序的最终用户无法遇到编译错误。
如果你想让这个值为nil
,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?")
}