我有点困难时间围绕选项,以及为什么它们是有益的。
首先,这两个代码块基本相同吗?
夫特:
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
答案 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问题和可选类型优势的一些重要信息。