설정할 수 있는 산우저드포츠 로케이터로 비사양 프로퍼티 리스트 봅니다.

I knew what was, but I 이 오류를 일으키는 생각해봤죠 can&, 내가 뭘 잘못했는지 t # 39 알아낼 것으로 보인다.

이것은 전체 오류 메시지를 I am getting.

&lt pre>; 객체에는 비사양 프로퍼티 리스트 설정할 수 봅니다. &quot, &amp, lt, BC_Person: &quot 0x8f3c140& gt;; 키 값을 페르손다타라이 산우저드포츠 표시됨과) &lt /pre>;

제가 생각하는 사람 ' (i have a 클래스' 를 따르는 ',' 나는 내 앞에 있는 사람이 두 가지 방법을 산코딩 포로토콜 클래스:

- (void)encodeWithCoder:(NSCoder *)coder {
    [coder encodeObject:self.personsName forKey:@"BCPersonsName"];
    [coder encodeObject:self.personsBills forKey:@"BCPersonsBillsArray"];
}

- (id)initWithCoder:(NSCoder *)coder {
    self = [super init];
    if (self) {
        self.personsName = [coder decodeObjectForKey:@"BCPersonsName"];
        self.personsBills = [coder decodeObjectForKey:@"BCPersonsBillsArray"];
    }
    return self;
}

어떤 시점에서 앱이 '산슬링' 를 'I have a 클래스', '및' 설정되었습니다 BC_PersonClass 다타사브 제가 생각하는 내 '등록 정보 처리 인코딩입니다 BC_PersonClass'. 다음은 코드를 사용하여 '에서' 나는 다타사브 클래스:

- (void)savePersonArrayData:(BC_Person *)personObject
{
   // NSLog(@"name of the person %@", personObject.personsName);

    [mutableDataArray addObject:personObject];

    // set the temp array to the mutableData array
    tempMuteArray = [NSMutableArray arrayWithArray:mutableDataArray];

    // save the person object as nsData
    NSData *personEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:personObject];

    // first add the person object to the mutable array
    [tempMuteArray addObject:personEncodedObject];

    // NSLog(@"Objects in the array %lu", (unsigned long)mutableDataArray.count);

    // now we set that data array to the mutable array for saving
    dataArray = [[NSArray alloc] initWithArray:mutableDataArray];
    //dataArray = [NSArray arrayWithArray:mutableDataArray];

    // save the object to NS User Defaults
    NSUserDefaults *userData = [NSUserDefaults standardUserDefaults];
    [userData setObject:dataArray forKey:@"personDataArray"];
    [userData synchronize];
}

이 정도면 좋겠다 하고 내가 할 수 있는 코드 전달자로써 ᅩ 알 수 있습니다. 내가 다시 내 BC_Person 클래스, 속성 그냥 나는 내 방식과 문제 방황케 인코딩입니다 can& # 39 m, t # 39, 잘못된 일을 표시되어도 I& 분석할 것 같다.

참 고맙네요!

질문에 대한 의견 (4)
해결책

이 코드는 할 수 있는 '맞춤형' 산우저드포츠 객체에는 배열입니다 게시하기를 저장할 수 있습니다. # 39, t can& 할 수 있습니다. # 39, 구현 방법 '산코딩 doesn&' t help. 산슬링 산디스티오나리 누자이 와 같은 것들을 저장할 수 있지만 '', '', '', '산드라타 네스 움베르 산드라테' 에서 ',' '및' '산우저드포츠'.

산드라타 변환하십시오 객체에는 합니다 '' (여러분과 같은 일부 코드) 및 저장할 수 있는 '산드라타' 에서 '산우저드포츠'. '한' 의 '' 할 경우 산드라타 누자이 저장할 수도 있습니다.

다시 읽을 때는 '을' 이 '네' BC_Person 어레이입니다 산드라타 물러서요 객체에는 우나르키베 합니다.

아마도 이거요.

- (void)savePersonArrayData:(BC_Person *)personObject {
    [mutableDataArray addObject:personObject];

    NSMutableArray *archiveArray = [NSMutableArray arrayWithCapacity:mutableDataArray.count];
    for (BC_Person *personObject in mutableDataArray) { 
        NSData *personEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:personObject];
        [archiveArray addObject:personEncodedObject];
    }

    NSUserDefaults *userData = [NSUserDefaults standardUserDefaults];
    [userData setObject:archiveArray forKey:@"personDataArray"];
}
해설 (13)

오히려 내게 보인다 고 실행하십시오 객체에는 agent. 통해 어레이입니다 및 인코딩합니다 산드라타 구하겠죠 네 오류 '틀' 이 (가) 는 비사양 프로퍼티 리스트 객체에는 bc_person 알리는 doesn& # 39, t know how to 직렬화할 네편이야 객체에는.

그래서 모든 것을 확인하기 위해 필요한 것은 그 사람이 객체에는 산코딩 준수하는 것이 설정값으로 맞춤형 객체에는 산드라타 및 저장 됩니다 어레이입니다 로 변환할 수 있습니다. 한 여기 놀이터:

  • 편집할지 *: Xcode 에서 쓰는 '7' 이 있어 데이터 및 뒤로를 산우저드포츠 줄바꿈할 아카이빙합니다 놀이터 및 인쇄 오버클로킹된 출력입니다. 이 경우 나중에 우저드포츠 단계는 고정식입니다 포함되어 있다.
//: Playground - noun: a place where people can play

import Foundation

class Person: NSObject, NSCoding {
    let surname: String
    let firstname: String

    required init(firstname:String, surname:String) {
        self.firstname = firstname
        self.surname = surname
        super.init()
    }

    //MARK: - NSCoding -
    required init(coder aDecoder: NSCoder) {
        surname = aDecoder.decodeObjectForKey("surname") as! String
        firstname = aDecoder.decodeObjectForKey("firstname") as! String
    }

    func encodeWithCoder(aCoder: NSCoder) {
        aCoder.encodeObject(firstname, forKey: "firstname")
        aCoder.encodeObject(surname, forKey: "surname")
    }
}

//: ### Now lets define a function to convert our array to NSData

func archivePeople(people:[Person]) -> NSData {
    let archivedObject = NSKeyedArchiver.archivedDataWithRootObject(people as NSArray)
    return archivedObject
}

//: ### Create some people

let people = [Person(firstname: "johnny", surname:"appleseed"),Person(firstname: "peter", surname: "mill")]

//: ### Archive our people to NSData

let peopleData = archivePeople(people)

if let unarchivedPeople = NSKeyedUnarchiver.unarchiveObjectWithData(peopleData) as? [Person] {
    for person in unarchivedPeople {
        print("\(person.firstname), you have been unarchived")
    }
} else {
    print("Failed to unarchive people")
}

//: ### Lets try use NSUserDefaults
let UserDefaultsPeopleKey = "peoplekey"
func savePeople(people:[Person]) {
    let archivedObject = archivePeople(people)
    let defaults = NSUserDefaults.standardUserDefaults()
    defaults.setObject(archivedObject, forKey: UserDefaultsPeopleKey)
    defaults.synchronize()
}

func retrievePeople() -> [Person]? {
    if let unarchivedObject = NSUserDefaults.standardUserDefaults().objectForKey(UserDefaultsPeopleKey) as? NSData {
        return NSKeyedUnarchiver.unarchiveObjectWithData(unarchivedObject) as? [Person]
    }
    return nil
}

if let retrievedPeople = retrievePeople() {
    for person in retrievedPeople {
        print("\(person.firstname), you have been unarchived")
    }
} else {
    print("Writing to UserDefaults is still broken in playgrounds")
}

짜잔 배열입니다 산우저드포츠 에 저장한 후, 사용자 정의 객체에는

해설 (10)

저장하라는:

NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:yourObject];
[currentDefaults setObject:data forKey:@"yourKeyName"];

Afaq:

NSData *data = [currentDefaults objectForKey:@"yourKeyName"];
yourObjectType * token = [NSKeyedUnarchiver unarchiveObjectWithData:data];

제거에 대한

[currentDefaults removeObjectForKey:@"yourKeyName"];
해설 (1)

# 3 개 솔루션 스위프트

# 단순 유틸리티 클래스

class ArchiveUtil {

    private static let PeopleKey = "PeopleKey"

    private static func archivePeople(people : [Human]) -> NSData {

        return NSKeyedArchiver.archivedData(withRootObject: people as NSArray) as NSData
    }

    static func loadPeople() -> [Human]? {

        if let unarchivedObject = UserDefaults.standard.object(forKey: PeopleKey) as? Data {

            return NSKeyedUnarchiver.unarchiveObject(with: unarchivedObject as Data) as? [Human]
        }

        return nil
    }

    static func savePeople(people : [Human]?) {

        let archivedObject = archivePeople(people: people!)
        UserDefaults.standard.set(archivedObject, forKey: PeopleKey)
        UserDefaults.standard.synchronize()
    }

}

모델 클래스

class Human: NSObject, NSCoding {

    var name:String?
    var age:Int?

    required init(n:String, a:Int) {

        name = n
        age = a
    }

    required init(coder aDecoder: NSCoder) {

        name = aDecoder.decodeObject(forKey: "name") as? String
        age = aDecoder.decodeInteger(forKey: "age")
    }

    public func encode(with aCoder: NSCoder) {

        aCoder.encode(name, forKey: "name")
        aCoder.encode(age, forKey: "age")

    }
}

# 호출 방법

var people = [Human]()

people.append(Human(n: "Sazzad", a: 21))
people.append(Human(n: "Hissain", a: 22))
people.append(Human(n: "Khan", a: 23))

ArchiveUtil.savePeople(people: people)

let others = ArchiveUtil.loadPeople()

for human in others! {

    print("name = \(human.name!), age = \(human.age!)")
}
해설 (2)

Xcode 9.1 조속한 - 4

  • 이 코드*의 시도하시겠습니까

  • 에 저장할 수 없습니다,,, 산드라테 네스 움베르 산슬링 매퍼에서 산우저드포트 산드라타 누자이, 또는 NSDictionary.* 저장할 수 있습니다.

let myData = NSKeyedArchiver.archivedData(withRootObject: myJson)
UserDefaults.standard.set(myData, forKey: "userJson")

let recovedUserJsonData = UserDefaults.standard.object(forKey: "userJson")
let recovedUserJson = NSKeyedUnarchiver.unarchiveObject(with: recovedUserJsonData)
해설 (3)

39 의 first off, rmaddy& 오토메이티드 (위) 는 오른쪽: # 39 산코딩 구축 ',' t help doesn&. 그러나 '' '와' 산키다크리버 산코딩 구현하십시오 합니다 사용할 수 있는 모든 도왔으매 it& # 39 의 하나만 더 단계입니다. 산드라타 변환 '를 통해'.

예 방법

- (NSUserDefaults *) defaults {
    return [NSUserDefaults standardUserDefaults];
}

- (void) persistObj:(id)value forKey:(NSString *)key {
    [self.defaults setObject:value  forKey:key];
    [self.defaults synchronize];
}

- (void) persistObjAsData:(id)encodableObject forKey:(NSString *)key {
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:encodableObject];
    [self persistObj:data forKey:key];
}    

- (id) objectFromDataWithKey:(NSString*)key {
    NSData *data = [self.defaults objectForKey:key];
    return [NSKeyedUnarchiver unarchiveObjectWithData:data];
}

'네' 랩 (wrap) '의 객체에는 누자이 산코딩 수 있도록 한' 또는 '또는' 산디스티오나리 그러든지요

해설 (0)

난 이미 사전 '저장' 산우저드포츠 이 문제가 있다. 이 때문에 '저장' 산뉴얼 v2.03-00 wouldn& 나타났다 # 39, t 값. 그래서 방금 다운로드됨 사전을 저장할 수 있는 '수' 를 사전 재거됨 null 산우저드포츠 변경 가능

NSMutableDictionary* dictionary = [NSMutableDictionary dictionaryWithDictionary:dictionary_trying_to_save];
[dictionary removeObjectForKey:@"NullKey"];
[[NSUserDefaults standardUserDefaults] setObject:dictionary forKey:@"key"];

이 경우 발생할 수 있는 '산뉴얼' 키 값을 줄 알았다.

해설 (0)

&gt. https://developer.apple.com/reference/foundation/userdefaults

&gt. 즉, 기본 객체 드라이브여야 합니다 속성 있는 목록 인스턴스입니다 (충족하거나 모음을 결합한 인스턴스를): 산드라타,,, 또는 산슬링 네스 움베르 산드라테 누자이 산디스티오나리.

&gt. 일반적으로 다른 유형의 객체에는 확인표시를 저장하였습니다 합니다 아카이빙할 redhat. 산드라타 인스턴스를 만듭니다. 자세한 내용은 기본 설정 프로그래밍 안내선.

해설 (0)

&gt. 스위프트 5: 산키다치버 코다블 대신 이 프로토콜을 사용할 수 있습니다.

struct User: Codable {
    let id: String
    let mail: String
    let fullName: String
}
    • 구조체입니다 는 사용자 정의 래퍼 우저드포츠 주변에 있는 현 표준 객체.
struct Pref {
    static let keyUser = "Pref.User"
    static var user: User? {
        get {
            if let data = UserDefaults.standard.object(forKey: keyUser) as? Data {
                do {
                    return try JSONDecoder().decode(User.self, from: data)
                } catch {
                    print("Error while decoding user data")
                }
            }
            return nil
        }
        set {
            if let newValue = newValue {
                do {
                    let data = try JSONEncoder().encode(newValue)
                    UserDefaults.standard.set(data, forKey: keyUser)
                } catch {
                    print("Error while encoding user data")
                }
            } else {
                UserDefaults.standard.removeObject(forKey: keyUser)
            }
        }
    }
}

사용할 수 있도록 it this way.

Pref.user?.name = "John"

if let user = Pref.user {...
해설 (1)
  • 매우 쉽게 5* 스위프트
//MARK:- First you need to encoded your arr or what ever object you want to save in UserDefaults
//in my case i want to save Picture (NMutableArray) in the User Defaults in
//in this array some objects are UIImage & Strings

//first i have to encoded the NMutableArray 
let encodedData = NSKeyedArchiver.archivedData(withRootObject: yourArrayName)
//MARK:- Array save in UserDefaults
defaults.set(encodedData, forKey: "YourKeyName")

//MARK:- When you want to retreive data from UserDefaults
let decoded  = defaults.object(forKey: "YourKeyName") as! Data
yourArrayName = NSKeyedUnarchiver.unarchiveObject(with: decoded) as! NSMutableArray

//MARK: Enjoy this arrry "yourArrayName"
해설 (0)