如果在Objective-C中重新调用上述方法,我们将使用NSNull作为占位符,Objective-C的调用语法如下所示:
复制代码
[dict valuesForKeys:@[@"1", @"4"] notFoundMarker:[NSNull null]].lastObject
// 5
[dict valuesForKeys:@[@"1", @"3"] notFoundMarker:[NSNull null]].lastObject
// NSNull
[dict valuesForKeys:@[] notFoundMarker:[NSNull null]].lastObject
// nil
不管是Swift版本还是Objective-C版本,返回值为nil都意味数组是空的,所以它就没有最后一个元素。 但是如果返回是Optional(nil)或者Objective-C中的NSNull都表示数组中的最后一个元素存在,但是元素的内容是空的。在Objective-C中只能借助NSNull作为占位符来达到这个目的,但是Swift却可以语言系统类型的角度的实现。
提供一个默认值
进一步封装,如果我字典中的某个或某些元素不存在,我们想提供一个默认值怎么办呢?实现方法很简单:
复制代码
extension Dictionary {
func valuesForKeys( keys:[Key], notFoundMarker: Value)->[Value]{
return self.valueForKeys(kes).map{ $0 ?? notFoundMarker }
}
}
dict.valuesForKeys(["1", "5"], notFoundMarker: "Anonymous")
和Objective-C相比,其需要占位符来达到占位的目的,但是Swift却已经从语言类型系统的层面原生的支持了这种用法,同时提供了丰富的语法功能。这就是Swift可选类型的强大之处。同时注意上述例子中用到了空合运算符??。
注:相关教程知识阅读请移步到swift教程频道。








