2016-06-04 5 views
0

나는이 오류를 찾고 다양한 stackoverflow, Apple 설명서 및 블로그 응답을 읽었지만 여전히 문제가 있습니다. NSData 및 NSCoding을 준수하는 클래스가 6 개 중 3 개가 저장됩니다. 필요한 편의 init에서 self.init를 호출 할 때 self.init 서명이 init과 정확하게 일치하더라도 ("복사 및 붙여 넣기") "여분의 인수 'groomedStatus'가 호출됩니다.self.init의 추가 인수 Swift 2.2

class Trail: NSObject, NSCoding { 
var name: String 
var difficulty: Difficulty 
var haveSkied: Bool 
var season: Season = .winter 
var open: String? 
var groomedStatus: String? 

init(name: String, difficulty: Difficulty, haveSkied: Bool, season: Season, open: String?, groomedStatus: String?) { 
    self.name = name 
    self.difficulty = difficulty 
    self.haveSkied = haveSkied 
    self.season = season 
    self.open = open 
    self.groomedStatus = groomedStatus 
} 

required convenience init(coder aDecoder: NSCoder) { 

    let haveSkied = aDecoder.decodeObjectForKey("haveSkied") as! Bool 
    let open = aDecoder.decodeObjectForKey("open") as? String 
    let groomedStatus = aDecoder.decodeObjectForKey("groomedStatus") as? String 


    self.init(name: String, difficulty: Difficulty, haveSkied: Bool, season: Season, open: String?, groomedStatus: String?) { 
     self.name = name 
     self.difficulty = difficulty 
     self.haveSkied = haveSkied 
     self.season = season 
     self.open = open 
     self.groomedStatus = groomedStatus 
    } 

func encodeWithCoder(aCoder: NSCoder) { 
    aCoder.encodeBool(haveSkied, forKey: "haveSkied") 
    aCoder.encodeObject(open, forKey: "open") 
    aCoder.encodeObject(groomedStatus, forKey: "groomedStatus") 
} 

}

+0

확실하지 않습니다. 이는 컴파일러 오류이므로 시뮬레이터에서 응용 프로그램을 제거하고 다시 설치하지 않았으며 명령 B를 변경 한 후 여러 번 빌드하려고 시도했습니다. – Eddy

+0

아, 그게 내가 어리석은 아이디어 였어. 다시 원래대로 변경하겠습니다. – Eddy

+1

오류 메시지가 약간 잘못된 것입니다. 문제는'init (coder ...') 메소드에서 중첩 된'init' 정의입니다. 전혀 작동하지 않습니다. 예를 들어'String' 타입이 아닌'name'을위한 실제 문자열을 전달해야합니다. – vadian

답변

1

문제 결과가 self.init()를 호출하는 방법과이는 관련 코드입니다. 코드에서 수행하는 방식은 본질적으로 컴파일러를 다시 정의하려는 시도입니다. 따라서 컴파일러에는 아무런 의미가 없습니다. 이것은 귀하의 편의 초기화 프로그램에서 self.init()으로 전화해야하는 방법입니다.

self.init(name: "yourActualNameString", difficulty: Difficulty(), haveSkied: true, season: .winter, open: "yourActualOpenString", groomedStatus: "yourActualGroomedStatusString") 
+0

감사합니다! encodeObject를 사용하여 클래스의 모든 속성을 저장하고 decodeObjectForKey를 사용하여 실제 값을 self.init에 전달했습니다. – Eddy