首页 > 解决方案 > 在 Swift 中展开可选的内部地图闭包

问题描述

我正在尝试在使用数组时创建一个Friend实例。它崩溃了,因为我被迫解开财产。mapmyEmplyee.imageString

我想要的是: 如果imageStringinEmployee是,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)" )
}

任何帮助将不胜感激。

标签: swift

解决方案


你可以做:

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.


推荐阅读