Развертывание необязательно внутри закрытия карты в Swift - PullRequest
0 голосов
/ 26 июня 2019

Я пытаюсь создать экземпляр Friend при использовании map в массиве myEmplyee.Это сбой, потому что я вынужден развернуть свойство .imageString.

То, что я хочу: Если imageString in 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)" )
}

Любая помощь будет оценена.

Ответы [ 3 ]

3 голосов
/ 26 июня 2019

Вы можете сделать:

let friendList = myEmplyee.map { employee -> Friend in
    let url = employee.imageString.flatMap { URL(string: "https:" + $0) }
    return Friend(name: employee.name, imageUrl: url)
}

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.

1 голос
/ 26 июня 2019

Вы можете просто развернуть 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)
}
1 голос
/ 26 июня 2019

Вы изменили свой вопрос с этим новым требованием:

То, что я хочу: если imageString в Employee равно nil, тогда я хочу Свойство imageUrl также будет равно нулю, когда экземпляр Friend создано.

В этом случае вы можете использовать flatMap на необязательно , чтобы получить результат:

var friendList = myEmplyee.map { Friend(name: $0.name,
    imageUrl: $0.imageString.flatMap { imgStr in URL(string: "https:" + imgStr) } ) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...