Упростить структуру данных Swift - PullRequest
0 голосов
/ 05 июля 2019

Любое предложение о том, как упростить эту структуру данных? Данные будут сохранены в виде словаря на диске пользователя, и когда я читаю данные с диска, мне нужно преобразовать их обратно в Member для легкого доступа к свойствам.

Я бы хотел, чтобы это было безопасно.

struct Member {
    var id: Int
    var firstname: String
    var lastname: String
    var address: String?
    var zipCode: Int?
    var city: String?

    enum Value: String {
        case id = "id"
        case firstname = "firstname"
        case lastname = "lastname"
        case address = "address"
        case zipCode = "zipCode"
        case city = "city"
    }

    var member: [String:Any] {
        return [
            Value.id.rawValue:Int(),
            Value.firstname.rawValue:firstname,
            Value.lastname.rawValue:lastname,
            Value.address.rawValue:address ?? String(),
            Value.zipCode.rawValue:zipCode ?? Int(),
            Value.city.rawValue:city ?? String()
        ]
    }
}

func memberToDic(member: Member) -> [String:Any] {
    return [
        Member.Value.firstname.rawValue:member.firstname,
        Member.Value.lastname.rawValue:member.lastname,
        Member.Value.address.rawValue:member.address ?? String(),
        Member.Value.zipCode.rawValue:member.zipCode ?? Int(),
        Member.Value.city.rawValue:member.city ?? String()
    ]
}

func dicToMember(dic: [String:Any]) -> Member {
    return Member(
        id: dic[Member.Value.id.rawValue] as! Int,
        firstname: dic[Member.Value.firstname.rawValue] as! String,
        lastname: dic[Member.Value.lastname.rawValue] as! String,
        address: dic[Member.Value.address.rawValue] as? String,
        zipCode: dic[Member.Value.zipCode.rawValue] as? Int,
        city: dic[Member.Value.city.rawValue] as? String
    )
}

1 Ответ

2 голосов
/ 05 июля 2019

Почти наверняка это правильная реализация:

struct Member: Codable {
    var id: Int
    var firstName: String // "first name" is two words, so capitalize "name"
    var lastName: String
    var address: String   // "No address" should be empty, not nil
    var zipCode: String   // ZIP codes are not integers
    var city: String      // "No city" should be empty, not nil
}

Чтобы сохранить это в виде списка, используйте PropertyListEncoder:

let data = try PropertyListEncoder().encode(member)

Чтобы прочитать его, используйте PropertyListDecoder.

Codable автоматически создает сопоставления клавиш для ваших свойств, поэтому в Value нет необходимости.

Вам следует строго избегать создания или использования [String: Any] словарей.Они существуют главным образом из-за интерфейсов Objective C, которые не могли генерировать сильные типы.

Если address, zipCode и city все должны быть установлены вместе, или не установлены вместе, то вы должны собратьих в единую структуру:

struct Address: Codable {
    var streetAddress: String
    var zipCode: String
    var city: String
}

struct Member: Codable {
    var id: Int
    var firstName: String // "first name" is two words, so capitalize "name"
    var lastName: String
    var address: Address?
}

В этом случае и Optional имеет смысл, потому что «пустой» - это не то же самое, что «отсутствующий».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...