代码之家  ›  专栏  ›  技术社区  ›  The iOSDev fibnochi

无法将自定义对象数组保存到Swift 4中的UserDefault

  •  0
  • The iOSDev fibnochi  · 技术社区  · 6 年前

    我已经搜索了大约2天了 Google StackOverflow 但是没有运气。

    我的自定义对象几乎是 CNContact 对象

    struct Contact: Codable {
    
    let fullName, phones, emails: String
    let imageDataAvailable, expanded: Bool
    let thumbnailImageData, imageData: Data
    let contactType: Int
    let identifier: String
    let namePrifix, givenName, middleName, familyName, previousFamilyName, nameSuffix, nickName, organizationName, departmentName, jobTitle, phoneticGivenName, phoneticMiddleName, phoneticFamilyName, phoneticOrganizationName, note: String
    let birthday, nonGregorianBirthday: DateComponents
    let dates: [ContactDate]
    let postalAddresses: [PostalAddress]
    let urlAddresses: [UrlAddress]
    let contactRelations: [ContactRelation]
    let socialProfiles: [SocialProfile]
    let instantMessageAddresses: [InstantMessageAddress]
    let phoneNumbers: [PhoneNumber]
    let emailAddresses: [Email]
    }
    
    struct PostalAddress: Codable {
        let label, street, subLocality, city, subAdministativeArea, state, postalCode, country, isoCountryCode: String
    }
    
    struct UrlAddress: Codable {
        let label, value: String
    }
    
    struct ContactRelation: Codable {
        let label, name: String
    }
    
    struct SocialProfile: Codable {
        let label, urlString, userName, userIdentifier, service: String
    }
    
    struct PhoneNumber: Codable {
        let label, stringValue: String
    }
    
    struct Email: Codable {
        let label, value: String
    }
    
    struct InstantMessageAddress: Codable {
        let label, userName, service: String
    }
    
    struct ContactDate: Codable {
        let label: String
        let value: DateComponents
    }
    

    我试图保存一个 Contact UserDefault 但它总是给我同样的错误。

    请帮我解决这个问题。

    编辑1

    密码

    do {
            let contactJson = try JSONSerialization.data(withJSONObject: arrContact, options: .prettyPrinted)
            CommonFunctions.setUserDefaultValue(key: WSKey.contacts.rawValue, value: contactJson)
        } catch let parsingError {
            print("Error", parsingError)
        }
    


    错误

    由于未捕获异常“NSInvalidArgumentException”而终止应用程序,原因:“JSON写入中的类型无效(_SwiftValue)”

    我的数组 debugDescription 日志中的命令如下

    “[StoreEdge.联系人(全名:\'Kate Bell\”,电话:\“(555)564-8583\n(415)555-3695\”,电子邮件:\'Kate Bell\”-bell@mac.com\,imageDataAvailable:false,expanded:false,thumbnailImageData:0字节,imageData:0字节,contactType:0,标识符:\“177C371E-701D-42F8-A03B-C61CA31627F6\”,namePrifix:\“\”,givenName:“Kate\”,middleName:\“\“,家族名称:\'Bell\”,以前的家族名称:\'”,名字uffix:\“\”,昵称:\“\”,组织名称:\'Creative Consulting\”,部门名称:\“\”,职位名称:\'Producer\”,拼音givenName:\“\”,拼音家族名称:\“\”,拼音组织名称:\“\”,注:\“\”,生日:格里高利(固定)年份:1978年月份:1天:20 isLeapMonth:false,非英国生日:isLeapMonth:false,日期:[],邮资:[StoreEdge.PostaladAddress(标签:\” $!!$ \,街道:\'165 Davis street\'、次区域:\'、城市:\'Hillsborough\'、次行政区:\'、州:\'CA\'、邮政编码:\'94010\'、国家:\'、等国家代码:\'us\')、URL地址:[存储边缘.UrlAddress(标签:\” $!!$ \,值:\“www.icloud.com\”),联系人关系:[],社交档案:[],InstantMessageAddress:[],PhoneNumber:[StoreEdge.PhoneNumber(标签:\” \“,stringValue:\”(555)564-8583\”,StoreEdge.PhoneNumber(标签:\” $!!$ \“,stringValue:\“(415)555-3695\”),电子邮件地址:[storeEdge.Email(标签:\” $!!$ $!!$ \“,街道:\'332拉古纳街\',次区域:\'”,城市:\'Corte Madera \',次行政区:\'”,州:\'CA\,邮政编码:\'94925\,国家:\'USA\,等国家代码:\'us\”),URL地址:[],联系人关系:[],社交文件:[],即时消息地址:[],电话号码:[储存。电话号码(标签:\” $!!$ \“,stringValue:\“555-478-7672\”,StoreEdge.PhoneNumber(标签:\” $!!$ \“,stringValue:\”(408)555-5270\”,StoreEdge.PhoneNumber(标签:\” $!!$ $!!$ $!!$ $!!$ $!!$ \“,stringValue:\“888-555-5512\”,StoreEdge.PhoneNumber(标签:\” $!!$ \“,stringValue:\“888-555-1212\”),电子邮件地址:[StoreEdge.Email(标签:\” $!!$ \,值:\“John-Appleseed@mac.com\),StoreEdge.Contact(全名:\“Anna Haro\”,电话:\“555-522-8243\”,电子邮件:\“Anna-haro@mac.com\,imageDataAvailable:false,expanded:false,thumbnailImageData:0字节,imageData:0字节,contactType:0,标识符:\“F57C8277-585D-4327-88A6-B5689FF69DFE\”,namePrifix:\“\”,givenName:\“Anna”\,中间名:\“\”,家庭名:\“Haro\”,以前的家庭名:\“\”,名字uffix:\“\”,昵称:\“Annie\”,组织名:\“\”,部门名:\“\”,职务名称:\“\”,拼音GivenName:\“\”,拼音中间名:\“\”,拼音家庭名:\“\”,拼音组织名:\“\”,注:“\”,生日:格里高利历(固定)年份:1985年月份:8天:29 isLeapMonth:false,非Regorian生日:isLeapMonth:false,日期:[StoreEdge.ContactDate(标签:\” $!!$ $!!$ \,值:日历:公历(固定)年:2002年月:2天:15 isLeapMonth:false)],邮资:[StoreEdge.PostaladAddress(标签:\” $!!$ \“,街道:\'1001利文沃思街\',次区域:\'”,城市:\'Sausalito\,次行政区:\'”,州:\'CA\,邮政编码:\'94965\,国家:\'USA\,等国家代码:\'us\”),URL地址:[],联系人关系:[],社交文件:[],即时消息地址:[],电话号码:[储存。电话号码(标签:\” $!!$ $!!$ \“,值:\”安娜-haro@mac.com\联系方式(全名:\“Hank M.Zakroff\”,电话:\“(555)766-4823\n(707)555-1854\”,电子邮件:\“Hank-zakroff@mac.com\,imageDataAvailable:false,expanded:false,thumbnailImageData:0字节,imageData:0字节,联系人类型:0,标识符:\“2E73EE73-C03F-4D5F-B1E8-44E85A70F170\”,namePrifix:\“\,givenName:“Hank\”,middleName:“M.”,familyName:“Zakroff\”,previousFamilyName:“\”,nameSuffix:“\”,昵称:“\”,组织名称:““Financial Services Inc.”,部门名称:“\”,职务名称:““投资组合经理”,拼音givenName:“\”,拼音middleName:“\”,拼音familyName:“\”,拼音组织名称:“\”,注:“\”,生日:isLeapMonth:false,非英国生日:isLeapMonth:false,日期:[],邮资:[StoreEdge.PostaladAddress(标签:\” $!!$ \“,街道:\'1741卡尼街\',次区域:\'”,城市:\'San Rafael\”,次行政区:\'”,州:\'CA\,邮政编码:\'94901\,国家:\',等国家代码:\'us\”),URL地址:[],联系人关系:[],社交文件:[],即时消息地址:[],电话号码:[存储区。电话号码(标签:\” $!!$ \“,stringValue:\“(555)766-4823\”,StoreEdge.PhoneNumber(标签:\” $!!$ \“,stringValue:\“(707)555-1854\”),电子邮件地址:[Storedge.Email(标签:\” $!!$ \,值:\“hank-zakroff@mac.com\)),Storedge.Contact(全名:\“David Taylor\”,电话:\“555-610-6679\”,电子邮件:\“\”,imageDataAvailable:false,expanded:false,thumbnailImageData:0字节,imageData:0字节,contactType:0,标识符:\“E94CD15C-7964-4A9B-8AC4-10D7CFB791FD\”,namePrifix:“\”,givenName:“David\”,middleName:“\“,家族名:\'Taylor\”,以前的家族名:\'Taylor\”,名字uffix:\“\”,昵称:\“\”,组织名:\“\”,部门名:\“\”,职务头衔:\“\”,拼音givenname:\“\”,拼音中间名:\“\”,拼音家族名:\“\”,拼音组织名:\“\”,注:\“在科尔的小联盟棒球队踢球”\n\,生日:日历:格里高利(固定)年份:1998年月份:6天:15 isLeapMonth:false,非英国生日:isLeapMonth:false,日期:[],邮资:[存储边缘.邮资(标签:\” $!!$ $!!$ \“,stringValue:\“555-610-6679\”),电子邮件地址:[]),StoreEdge.Contact(全名:\“mavya。soni@jayatma.com\”,电话:\“\”,电子邮件:\“mavya。soni@jayatma.com\,imageDataAvailable:false,expanded:false,thumbnailImageData:0字节,imageData:0字节,contactType:0,标识符:\“F01A8F75-B1E0-4B72-A017-6FDE693BE4E4\”,namePrifix:\“\“,givenName:\”mavya。soni@jayatma.com\,中间名:\“\”,家族名:\“\”,以前的家族名:\“\”,名字后缀:\“\”,昵称:\“\”,组织名:\“\”,部门名:\“\”,职务名称:\“\”,拼音名称:\“\”,拼音中间名:\“\”,拼音家族名:\“\”,拼音组织名:\“\”,注:\“\”,生日:isLeapMonth:false,非regorian生日:isLeapMonth:false,日期:[],邮寄地址:[],URL地址:[],联系人关系:[],社交档案:[],InstantMessageAddress:[],电话号码:[],电子邮件地址:[StoreEdge.Email(标签:\” $!!$ \,值:\“mavya。soni@jayatma.com\)),StoreEdge.Contact(全名:\“Dimple Shah\”,电话:\“\”,电子邮件:\“\”,imageDataAvailable:false,expanded:false,thumbnailImageData:0字节,imageData:0字节,contactType:0,标识符:\“4B0CE4C4-6569-4936-8C45-34A15725DF9D\”,namePrifix:\“\”,givenName:“Dimple\”,middleName:“\“,家族名:\“Shah\”,以前的家族名:\“\”,名字uffix:\“\”,昵称:\“\”,组织名:\“\”,部门名:\“\”,职位名:\“\”,拼音givenname:\“\”,拼音中间名:\“\”,拼音组织名:\“\”,备注:\“\”,生日:isLeapMonth:false,非Regorian生日:isLeapMonth:false,日期:[]、邮寄地址:[]、URL地址:[]、联系人关系:[]、社交档案:[]、InstantMessageAddress:[]、电话号码:[]、电子邮件地址:[]、StoreEdge.Contact(全名:\”yash。soni@jayatma.com电话:\“\”,电子邮件:\“yash。soni@jayatma.com\",imageDataAvailable:false,expanded:false,thumbnailImageData:0字节,imageData:0字节,contactType:0,标识符:\“36C2E9A2-3955-49C7-BCED-02CDD1622E69\”,namePrifix:\“\”,givenName:“yash”。soni@jayatma.com\,middleName:\“\”,familyName:\“\”,以前的familyName:\“\”,nameSuffix:\“\”,昵称:\“\”,组织名称:\“\”,部门名称:\“\”,职位名称:\“\”,语音赠品名称:\“\”,语音中间名:\“\”,语音家庭名称:\“\”,语音组织名称:\“\”,备注:\“\”,生日:isLeapMonth:false,非英国生日:isLeapMonth:false,日期:[],邮寄地址:[],联系关系:[],社交档案:[],InstantMessageAddress:[],电话号码:[],电子邮件地址:[StoreEdge.Email(标签:\” $!!$ \,值:\“yash。soni@jayatma.com\联系人(全名:\“Bhavesh Panchal\”,电话:\“\”,电子邮件:\“Bhavesh”。panchal@jayatma.com\,imageDataAvailable:false,expanded:false,thumbnailImageData:0字节,imageData:0字节,contactType:0,标识符:\“564EB186-036C-437D-952D-A09A85A21027\”,namePrifix:\“\”,givenName:\“Bhavesh”\,中间名:\“\”,家族名:\“Panchal\”,以前的家族名:\“\”,名字uffix:\“\”,昵称:\“\”,组织名:\“\”,部门名:\“\”,职务名称:\“\”,拼音给定名称:\“\”,拼音中间名:\“\”,拼音家族名:\“\”,拼音组织名:\“\”,注:\“\”,生日:isLeapMonth:false,非regorian生日:isLeapMonth:false,日期:[],邮寄地址:[],URL地址:[],联系人关系:[],社交档案:[],InstantMessageAddress:[],电话号码:[],电子邮件地址:[StoreEdge.Email(标签:\” $!!$ $!!$ \“,stringValue:\“7575801826\”),电子邮件地址:[StoreEdge.Email(标签:\” $!!$ \,值:\“kayamuddin。ansari@jayatma.com\),StoreEdge.Contact(全名:\“Manan Bhatt\”,电话:\“7575801826\”,电子邮件:\“Manan。bhatt@jayatma.com\,imageDataAvailable:false,expanded:false,thumbnailImageData:0字节,imageData:0字节,contactType:0,标识符:\“0C1E052F-6636-4D47-979E-CFF2A66CF505\”,namePrifix:\“\”,给定名称:\”Manan\”,middleName:\“\”,familyName:\“Bhatt\”,以前的familyName:\“\”,nameSuffix:\“\”,昵称:\“\”,组织名称:\“\”,部门名称:\“\”,职务名称:\“\”,拼音GivenName:\“\”,拼音middleName:“\”,拼音familyName:“\”,拼音组织名称:\”,注:\”\,生日:isLeapMonth:false,非regorian生日:isLeapMonth:false,日期:[],邮寄地址:[],URL地址:[],联系人关系:[],社交档案:[],InstantMessageAddress:[],电话号码:[StoreEdge.PhoneNumber(标签:\) $!!$ \“,stringValue:\“7575801826\”),电子邮件地址:[StoreEdge.Email(标签:\” $!!$ \,值:\“manan。bhatt@jayatma.com\")])]"

    1 回复  |  直到 6 年前
        1
  •  1
  •   Stephan Schlecht    6 年前

    由于您的联系人是可编码的,您可以利用JSONECODER/JSONDecoder并执行以下操作:

    if let json = try? JSONEncoder().encode(contact) {
        userDefs?.setValue(json, forKey: "contact");
        ...
    

    要再次检索联系人,请执行以下操作:

     if let loaded = userDefs?.value(forKey: "contact") as? Data {
         let contact2 = try? JSONDecoder().decode(Contact.self, from: loaded)
          ...