swift - 在 Swift 中展开可选的内部地图闭包
问题描述
我正在尝试在使用数组时创建一个Friend
实例。它崩溃了,因为我被迫解开财产。map
myEmplyee
.imageString
我想要的是:
如果imageString
inEmployee
是,nil
那么我希望imageUrl
属性也是nil
在创建实例时Friend
。
在下面粘贴我的代码:
import UIKit
struct Employee {
var name: String
var imageString: String?
}
struct Friend {
var name: String
var imageUrl: URL?
}
var myEmplyee = [Employee]()
myEmplyee.append(Employee(name: "a1", imageString: "a1ImageUrl.png"))
myEmplyee.append(Employee(name: "a2", imageString: "a2ImageUrl.png"))
myEmplyee.append(Employee(name: "a3", imageString: "a3ImageUrl.png"))
myEmplyee.append(Employee(name: "a4", imageString: "a4ImageUrl.png"))
myEmplyee.append(Employee(name: "a5", imageString: "a5ImageUrl.png"))
myEmplyee.append(Employee(name: "a6", imageString: nil))
var friendList = myEmplyee.map { Friend(name: $0.name, lName: URL(string: "https:" + $0.imageString!)) }
for obj in friendList {
print("First Name: \(obj.name), Last Name: \(obj.imageUrl)" )
}
任何帮助将不胜感激。
解决方案
你可以做:
let friendList = myEmplyee.map { employee -> Friend in
let url = employee.imageString.flatMap { URL(string: "https:" + $0) }
return Friend(name: employee.name, imageUrl: url)
}
与 optional 结合的flatMap
意思是“如果这个可选不是nil
,则返回这个闭包的值。”
不用说,只是在“https:”之后附加图像名称是行不通的。例如,“https:a1ImageUrl.png”不是一个有效的 URL。你可能想要这样的东西:
let baseURL = URL(string: "https://example.com/images/")!
let friendList = myEmplyee.map { employee -> Friend in
let url = employee.imageString.map { baseURL.appendingPathComponent($0) }
return Friend(name: employee.name, imageUrl: url)
}
因为appendingPathComponent
不返回可选项,在这种情况下我们可以使用map
代替flatMap
.
推荐阅读
- jenkins - 如何将 REST API 与指向共享库的 Jenkinsfile 一起使用?
- c++ - 改变
/ 的对比 - python - python scrapy从产品页面获取url列表
- windows - 由于电源故障而突然关闭后,Windows .NET 应用程序无法打开
- json - 带有 Json 数据的 Flutter gridview 项目导航
- django-models - 添加一个对象同时删除另一个对象
- visual-studio-code - VSCode 扩展从今天起不起作用
- r - 使用带有 R 的 sf 包从线、圆和弧创建多边形
- javascript - 属性或方法“buscador”未在实例上定义,但在渲染期间被引用。Vue.js
- c - 显式转换后是否会发生整数提升?