在Swift中展开可选的内部地图闭合

时间:2019-06-26 03:46:22

标签: swift

我正在尝试在Friend数组上使用map的同时创建myEmplyee的实例。它崩溃是因为我被迫解开.imageString属性。

我想要的是: 如果imageString中的Employeenil,那么在创建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)" )
}

任何帮助将不胜感激。

3 个答案:

答案 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)
}