可选变量如何成为强大的解决方案"?

时间:2014-09-24 19:01:24

标签: 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 * somestring = @"Test";

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

NSString * anotherstring = nil;

if(anotherstring == [NSNull null]){
  //display error.
} 

所以我真的很困惑这是如何强大,因为他们声称它已经存在于以前的语言。

Some info about Optional Variables

3 个答案:

答案 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?")
}