Map all the things in Swift 映射所有东西
在上一篇文章中我们为数组引入了map()和flatMap(),详细讲解了他们的用法和优点,其实map和flatMap也适用于Optionals类型 和 其他很多的类型,今天我们来探索下他们的用法。 对比下Array 和 Optional回忆一下,我们之前学习的在Array上使用map和flatMap的用法是这样的: // Method on Array<T>
map( transform: T -> U ) -> Array<U>
flatMap( transform: T -> Array<U> ) -> Array<U>
这意味着如果提供一个转换方式:T->U的话,你可以将一个包含T的Array转换成一个包含U的Array。也就是说让 类似的,map和flatMap在 // Method on Optional<T>
map( transform: T -> U ) -> Optional<U>
flatMap( transform: T -> Optional<U> ) -> Optional<U>
map() on Optionalsok,我们来看看map()在 看回我们的例子我们来看看怎样在我们之前的代码里用上我们所说的方法。 记得在上一篇文章我们的示例代码中,我们的 当然在以前,我们可以使用Optional Binding来做: let icon: UIImage?
if let iconName = itemDesc["icon"] as? String {
icon = UIImage(named: iconName)
} else {
icon = nil
}
为了更加简便,节省代码行数,我们还可以用 nil联结操作符 let iconName = itemDesc["icon"] as? String
let icon = UIImage(named: iconName ?? "")
当iconName为nil时,将”“赋值给iconName作为UIImage构造函数的参数: 我们用map试试事实上我们需要的是当Optional非nil的时候将其解包,并且将他的真实值作为参数传递给 let iconName = itemDesc["icon"] as? String
item.icon = iconName.map { imageName in UIImage(named: imageName) }
想法是对的,可是上面的代码必须是编译不过的!问题出在哪里呢?先解释下上面这段代码。我们让iconName这个Optional值调用map()方法,映射其非nil的值(真实值){换句话说:当iconName非nil时执行map闭包里的转换规则}成为参数imageName传入闭包,构造出一个UIImage对象。问题就出在如果imageName不是一个有效图片名字,或者因为某种原因取不到的话,UIImage就为nil,所以 救星faltMapflatMap做了什么转换? let iconName = itemDesc["icon"] as? String
item.icon = iconName.flatMap { imageName in UIImage(named: imageName) }
因此,在这个应用中,flatMap做了这些事情: 魔法:使用init简化闭包在Xcode7 后构造器可以通过 let iconName = itemDesc["icon"] as? String
item.icon = iconName.flatMap(UIImage.init)
。。。。这个用法我还没有理解得非常通,不过好像仅仅在IOS8以上生效,最后谢谢捧场! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |