我正在尝试在Friend
数组上使用map
的同时创建myEmplyee
的实例。它崩溃是因为我被迫解开.imageString
属性。
我想要的是:
如果imageString
中的Employee
为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)" )
}
任何帮助将不胜感激。
答案 0 :(得分:3)
您可以这样做:
let friendList = myEmplyee.map { employee -> Friend in
let url = employee.imageString.flatMap { URL(string: "https:" + $0) }
return Friend(name: employee.name, imageUrl: url)
}
flatMap
与optional一起表示“如果此可选不是nil
,则返回此闭包的值。”
不过,不用说,仅在“ https:”之后附加图片名称是行不通的。例如,“ https:a1ImageUrl.png”不是有效的网址。您可能想要类似的东西:
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
。
答案 1 :(得分:1)
您通过以下新要求更改了问题:
我想要的是:如果Employee中的imageString为nil,那么我想要 当Friend的实例为时,imageUrl属性也为nil 已创建。
在这种情况下,您可以在可选上使用flatMap
来提供结果:
var friendList = myEmplyee.map { Friend(name: $0.name,
imageUrl: $0.imageString.flatMap { imgStr in URL(string: "https:" + imgStr) } ) }
答案 2 :(得分:1)
如果使用 可选绑定 ( imageString
,则可以打开 if let
>),然后使用未包装的值(即
URL
实例
let friendList = myEmplyee.map { (emp) -> Friend in
var url: URL?
if let imageString = emp.imageString {
url = URL(string: "https:" + imageString)
}
return Friend(name: emp.name, imageUrl: url)
}