2016-08-04 3 views
-1

중첩 클래스를 초기화 할 수 있는지 궁금합니다. 차를 초기화하는 경우 타이어 압력을 설정 :Swift : 중첩 클래스 초기화

class Tyre { 
    var pressure : Double = 0.0 

    init() { } 

    init(withPressure p: Double) { 
     self.pressure = p 
    } 
} 

class Car { 
    var tyre = Tyre() 
} 

// should return 2.5 
let myCar = Car().tyre(withPressure : 2.5).pressure 

를 이제이 작품, 기본 초기화()와 함께 :

let myCar = Car().tyre.pressure // return 0.0 

감사합니다 사전에 귀하의 회신을!

+0

물론 있지만 타이어를 초기화 자동차 초기화를 작성해야합니다. – matt

+0

그 점을 이해합니다. 나는 왜 디폴트 init이 사용될 수 있는지 (왜 그런가!) 왜 init을 매개 변수와 함께 사용할 수 없는지 궁금했다. 아마도 이것은 멍청한 질문이지만, "Car(). tire (withPressure : 2.5)"타이어도 초기화되는 것으로 생각했습니다. 그러나 나는 그렇지 않다 ... – etri

답변

2

당신은 확실히 그렇게 할 수는 없지만, 당신은 당신의 자동차의 init 매개 변수로 지정 타이어에 전달할 수 있습니다

class Tyre { 
    var pressure : Double = 0.0 

    init() { } 

    init(withPressure p: Double) { 
     self.pressure = p 
    } 
} 

class Car { 
    var tyre: Tyre! 

    init(withTyre t: Tyre) { 
     self.tyre = t 
    } 
} 

let myCar = Car(withTyre: Tyre(withPressure : 2.5)) 

// should return 2.5 
let pressure = myCar.tyre.pressure 
0
class Tyre { 
    var pressure : Double = 0.0 

    init() { } 

    init(withPressure p: Double) { 
     self.pressure = p 
    } 
} 

class Car { 
    var tyre = Tyre() 
} 

// should return 2.5 
let myCar = Car() 

myCar.tyre = Tyre(withPressure: 2.5) 

print(myCar.tyre.pressure) 
1

는 별도로 tyre를 초기화해야합니다. 당신은 두 가지 방법으로 그것을 할 수 있습니다.

class Car { 
    var tyre 

    init(withTyre tyre: Tyre) { 
     self.tyre = tyre 
    } 
} 

let tyre = Tyre(withPressure: 2.5) 
let car = Car(withTyre: tyre) 
+0

대안을 가져 주셔서 감사합니다! – etri

+0

이것은 자동차 이니셜 라이저를 작성하는 방법에 대한 두 가지 선택 사항을 모두 보여주기 때문에 가장 좋은 답변입니다. 그러나 어느 쪽이든, 당신 (OP)이 요구하는 것은 자동차 이니셜 라이저가 필요합니다. 마술로 언어 구문의 규칙을 위반할 수는 없습니다. – matt

1
class Tyre { 
    var pressure : Double = 0.0 

    init() { } 

    init(withPressure p: Double) { 
     self.pressure = p 
    } 
} 

class Car { 
    var tyre : Tyre 
    init(withPressure p:Double) { // <-- this is the only change from your code 
     self.tyre = Tyre(withPressure:p) 
    } 
} 

// should return 2.5 
let myCar = Car(withPressure : 2.5) 
myCar.tyre.pressure // 2.5 
0

내가 내 질문에 대한 답을 찾았지만 사용하여 클래스의 자동차를 변경했다 :

class Car { 
    var tyre 

    init(withTyrePressure tyrePressure: Double) { 
     tyre = Tyre(withPressure: tyrePressure) 
    } 
} 

또는 Cartyre 매개 변수를 수행 할 수 있습니다 어느 Car는 유형 압력 매개 변수를 취할 수 속성을 사용하는 대신 클래스 Tire를 반환하는 함수 타이어. 그래서 할 수 있습니다! ;-)

(가) 예를 아래에 의미가 있지만, 단지 원칙의 증거가되지 않을 수도 있습니다 ...

class Tyre { 
    var pressure : Double = 0.0 

    init() { } 

    init(withPressure p: Double) { 
     self.pressure = p 
    } 
} 

class Car { 
    //var tyre = Tyre(withPressure: 2.5) 

    func tyre (withPressure p: Double) -> Tyre { 
     return Tyre(withPressure: p) 
    } 
} 


let myCar = Car().tyre(withPressure: 2.2).pressure