2015-01-03 4 views
2

아래 프로그램을 실행하면 분할 오류가 발생합니다. 왜 내가 알아낼 수있게 도와 줄 수 있니? 감사합니다스위프트 클래스 : 참조주기

class Animal:NSObject{ 
    var name:String! 
    var age:UInt! 

    weak var spouse:Animal? 
    init(name:String,age:UInt){ 
     self.name=name 
     self.age=age 
    } 

    func description() ->String{ //to become printable 
     return "name= \(name) and age=\(age) spouse=\(spouse)" 
    } 
} 


let dog=Animal(name:"Lucky",age:3) 
let cat=Animal(name:"Branson",age:4) 
dog.spouse=cat 
cat.spouse=dog //It doesnt crash if I comment this line out 
println(dog) 

답변

4

인쇄시 무한 재귀 문제가 있습니다. 한 번 전체주기를 설정하면 동물을 인쇄하기 위해 배우자가 인쇄됩니다. 배우자는 배우자를 인쇄합니다. 배우자는 자신의 배우자 등을 인쇄 할 때마다 스택 공간이 부족해 지거나 충돌 할 때까지 계속 인쇄합니다.

당신은 그 동물의 전체 인쇄를 호출하지 않고 동물의 배우자를 인쇄하여 그 휴식이 같은 필요

class Animal: NSObject { 
    // you should avoid using implicitly unwrapped optionals 
    // unless you absolutely have to for a specific reason that 
    // doesn’t appear to apply here (so remove the !s) 
    var name: String 
    var age: UInt 
    weak var spouse: Animal? 

    init(name: String, age: UInt) { 
     self.name = name 
     self.age = age 
    } 
} 

// to make something printable, you need to conform 
// to the Printable protocol 
extension Animal: Printable { 
    // And make description is a var rather than a function 
    override var description: String { 
     let spousal_status = spouse?.name ?? "None" 
     return "name=\(name) and age=\(age), spouse=\(spousal_status)" 
    } 
} 


let dog = Animal(name: "Lucky", age: 3) 
let cat = Animal(name: "Branson", age: 4) 
dog.spouse = cat 
dog.description 
cat.spouse = dog 
println(dog) // Prints name=Lucky and age=3, spouse=Branson 

주, 당신은 피하기 위해 프로토콜과 VAR 완벽 Printable을 구현해야 이 문제는 그렇지 않으면 문제가 여전히 발생하는 기본 구현을 얻게됩니다.

은 BTW, 스위프트 스타일 규칙은 (그렇게하지 않으면 사실 가끔 컴파일 문제가 발생할 수 있습니다) { 등을하기 전에, =, -> 같은 일 사이에 공간을 배치하는 것입니다. 배심원은 여전히 ​​ a: b 대 밖으로 a:b 밖에 있지만, 후자는 조금 더 읽기가 어렵습니다.

+0

대단히 감사합니다. 어제 내 실수를 풀어 내 코드에서이를 수정할 수있었습니다. 귀하의 의견에 진심으로 감사드립니다. –

+0

반갑습니다. Stack Overflow 팁 - 질문에 잘 대답하는 사람에게 감사하는 방법은 대답을 수락하는 것입니다. 이것은 다른 사람들이 주어진 답이 질문에 답하는 것을 볼 수있게 도와줍니다. (어쨌든 - 답이 완전히 정확하다는 것을 의미하지는 않습니다.) –

0

코드가 스택 오버플로를 유발합니다. description 메서드는 spouse 설명을 포함하며, 이는 결국 spouse 등의 설명을 끝없이 반복합니다. 이것을 시도하십시오 :

func description() -> String { 
    return "name= \(name) and age=\(age) spouse=\(spouse?.name)" 
} 
관련 문제