迅捷的选择混淆

时间:2014-06-11 15:19:15

标签: swift optional

我有点困难时间围绕选项,以及为什么它们是有益的。

首先,这两个代码块基本相同吗?

夫特:

if let unwrappedName = p.name {
    var greeting = “Hello “ + unwrappedName
} else {
    var greeting = “Hello stranger”
}

目标-C:

NSString *greeting;

if (p.name) {
    greeting = [NSString stringWithFormat:@"Hello %@", p.name];
} else {
    greeting = @"Hello stranger"
}

其次,这是来自Swift iBook,我对这些没有任何错误,但它们之间究竟有什么区别?

1

let optionalSquare: Square? = Square(sideLength: 10, name: "Optional Square")

let sideLength = optionalSquare?.numberOfSides

2

let optionalSquare: Square! = Square(sideLength: 10, name: "Optional Square")

let sideLength = optionalSquare?.numberOfSides

3

let optionalSquare: Square? = Square(sideLength: 10, name: "Optional Square")

let sideLength = optionalSquare!.numberOfSides

1 个答案:

答案 0 :(得分:2)

是的,对于Objective-C引用的引用类型,可选类型非常相似。关键的区别在于非可选类型永远不会是" nil"。如果您调用的方法返回的类型是Object?,则在使用它之前必须将其解包。很明显,响应可以是空的"并且编译器将强制您处理它。

如果类型不是可选的,那么在使用之前你永远不需要检查它是否为零。此外,可选使用Int类等值类型。您不需要记住空值是0还是-1还是其他一些魔术值。

当你考虑使用魔法哨兵值时,你应该使用可选项,这意味着缺少某些东西,即0,-1,nil,空列表,空字符串等。不难记住应该是什么检查但很容易忘记。使用可选项,您无需"仔细检查"它不是零,即使它不应该是零,但也许它是"。而是返回-1作为未找到的对象的索引返回Int?。

表示,如果找不到文件,您可以传递一个可选对象,而不是抛出异常

与期权比较:

if let mapleSyrup = shoppingList.removeAtIndex(3) {
    print "Bought /(mapleSyrup)"
}

没有选项而且没有完全清晰的文档:

 var mapleSyrup = shoppingList.removeAtIndex(3)
 if mapleSyrup != nil && mapleSyrup.isEmpty {
    print "Bought /(mapleSyrup)"
 }

第二个问题在swift ibook here中得到了很好的回答。

 let optionalSquare: Square! = Square(sideLength: 10, name: "Optional Square")

允许您使用optionalSquare,就像它是一个普通变量一样,并且不需要先解包。

let sideLength = optionalSquare!.numberOfSides

如果您知道optionalSquare有值,则可以强制解包并与!一起使用。

这个article首先提供了有关nil问题和可选类型优势的一些重要信息。