Как я могу начать структуру из значений другой структуры - PullRequest
0 голосов
/ 25 января 2019

У меня есть профиль пользователя, который я храню со структурой, похожей на

struct Profile: Codable {

    let company: String?
    let country: String?
    let createdDate: String?
    let dateOfBirth: String?
    let department: String?
    let email: String?
    let employeeKey: String?
    let firstName: String?
    let gender: String?
    let id: String?
    let jobTitle: String?
    let lastName: String?
    let location: String?
    let mobileDeviceToken: String?
    let pictureUri: String?
    let roles: [String]?
    let status: String?
    let updatedDate: String?
    let userId: String?
    let webDeviceToken: String?
    let webMobileDeviceToken: String?

    enum CodingKeys: String, CodingKey {
        case company = "company"
        case country = "country"
        case createdDate = "createdDate"
        case dateOfBirth = "dateOfBirth"
        case department = "department"
        case email = "email"
        case employeeKey = "employeeKey"
        case firstName = "firstName"
        case gender = "gender"
        case id = "id"
        case jobTitle = "jobTitle"
        case lastName = "lastName"
        case location = "location"
        case mobileDeviceToken = "mobileDeviceToken"
        case pictureUri = "pictureUri"
        case roles = "roles"
        case status = "status"
        case updatedDate = "updatedDate"
        case userId = "userId"
        case webDeviceToken = "webDeviceToken"
        case webMobileDeviceToken = "webMobileDeviceToken"
    }
}

У меня есть другая структура, которая выглядит как

struct ArticleAuthor {
    let name: String
    let department: String
    let email: String
}

При получении профиля пользователя я хотел бы иметь возможность создавать свою структуру ArticleAuthor, используя объект Profile, возвращенный из моей службы профилей.

Я надеялся сделать что-то подобное, но это не работает, так как ожидается, что значением from будет data.

        self?.profileService.fetchForUserByUserId(userId: authorId) { [weak self] profile, error in
            guard error == nil else { return }

            let author = try? JSONDecoder().decode(ArticleAuthor.self, from: profile)

                print(author) // should be a populated author property

        }

Я надеялся избежать чего-то вроде let author = ArticleAuthor(name: profile?.firstName, department: profile?.department, email: profile?.email), так как этот объект мог расти со временем.

1 Ответ

0 голосов
/ 25 января 2019

Объект профиля в вашем примере кода уже «Декодирован», поэтому вам не нужно декодировать его снова.

Чтобы избежать использования init по умолчанию, вы можете просто добавить пользовательский инициализатор, чтобы вы могли передать структуру Profile и установить значения. Обычно это лучший способ сделать это, поскольку он предотвращает внесение множества изменений в кодовую базу при добавлении новых свойств

struct ArticleAuthor {
    let name: String?
    let department: String?
    let email: String?

    init(profile: Profile) {
        self.name = profile.firstName
        self.department = profile.department
        self.email = profile.email
    }
}

self?.profileService.fetchForUserByUserId(userId: authorId) { [weak self] profile, error in
    guard error == nil else { return }

    let author = Author(profile: profile)
    print(author) // should be a populated author property
}
...