2014-11-07 3 views
0

내가 다음과 같은 것을하고 싶다고 상상해보십시오. 몇 가지 속성이있는 UIView의 사용자 지정 하위 클래스가 있습니다. 다른 이전 속성에서 초기화하려는 속성 중 하나입니다.Swift에서 하나의 기본 속성 값을 다른 값으로 전달

이 코드는 오류를 나타냅니다 : 'MyView.Type' does not have a member named 'driver'. 따라서이 문제를 해결하려는 확실한 시도는 초기화 프로그램에서 기본값을 정의하는 것입니다. ONE 이니셜 라이저 만 있다면 괜찮습니다. 그러나 우리가 몇 개 있다면 어떨까요?

class MyView :UIView { 

    var driver = HumanDriver() 

    var car 
    var plane 
    var train 
    var spaceship 

    override init() { 
     setupMyView() 
     super.init() 
    } 
    required init(coder aDecoder: NSCoder) { 
     setupMyView() 
     super.init(coder:aDecoder) 
    } 
    override init(frame: CGRect) { 
     setupMyView() 
     super.init(frame: frame) 
    } 

    func setupMyView() { 
     car = Car(driver: driver) 
     plane = Plane(driver: driver) 
     train = Train(driver: driver) 
     spaceship = Spaceship(driver: driver) 
    } 

} 

을하지만이 또한 오류로이 시간을 초래한다 : 잘 나는 아래, 하나의 설정 기능에 공통 코드를 수집하기 위해 시도 할 수 'self' used before super.init call을. 이것은 init이 호출되기 전에 self를 사용하기 때문에 이해할 수 있습니다.

거기에 좋은 해결책이 있습니까? 분명히 나는 ​​암시 적으로 래핑 된 옵션을 사용할 수 있었지만, 더 좋은 방법이 있어야하는 것처럼 보였다.

+0

?? 또한 코더 ?? –

답변

1

드라이버 설정 도구를 재정의하고 거기에 속성을 설정하는 방법은 무엇입니까? 다음과 같은 내용 :

class MyView :UIView { 

    var driver:HumanDriver = HumanDriver() { 
     didSet{ 
      car = Car(driver: driver) 
      plane = Plane(driver: driver) 
      train = Train(driver: driver) 
      spaceship = Spaceship(driver: driver) 
     } 
    } 

    var car: Car? 
    var plane: Plane? 
    var train: Train? 
    var spaceship: Spaceship? 
} 

이렇게하면 초기화 도구를 정리할 수 있습니다. 적어도 필요한 초기화 도구를 추가해야하지만 Btw는 다른 것입니다. 나는 이것이 당신이 끝내고 싶어 할 수있는 가장 깨끗한 해결책 중 하나라고 생각합니다.

희망이 도움이됩니다.

+0

실제로 "드라이버"의 값을 초기화 할 때 didSet이 호출되지 않는다고 생각하므로 작동하지 않습니다. – chris838

0

대답은 여기에 있습니다 : https://stackoverflow.com/a/26772103/1025041 실제로 무엇을 찾고 있었습니까? 실제로 성취하려는 것에 대한 많은 상용구입니다. 미래에 Apple이 더 쉽게 만들 수 있기를 바랍니다. 참고로

,이 방법은 내 예에 적용 할 방법은 다음과 같습니다

당신이 초기화 및 초기화 (프레임을 작성하는 이유 : 두 방법을
extension UIView { 
    enum InitMethod { 
     case Default 
     case Coder(NSCoder) 
     case Frame(CGRect) 
    } 
} 

class MyView: UIView { 

    var driver = HumanDriver() 

    var car 
    var plane 
    var train 
    var spaceship 

    override convenience init() { 
     self.init(.Default) 
    } 

    override convenience init(frame: CGRect) { 
     self.init(.Frame(frame)) 
    } 

    required convenience init(coder aDecoder: NSCoder) { 
     self.init(.Coder(aDecoder)) 
    } 

    private init(_ initMethod: InitMethod) { 

     car = Car(driver: driver) 
     plane = Plane(driver: driver) 
     train = Train(driver: driver) 
     spaceship = Spaceship(driver: driver) 

     switch initMethod { 
      case .Default: super.init() 
      case let .Coder(coder): super.init(coder: coder) 
      case let .Frame(frame): super.init(frame: frame) 
     } 
    } 
} 
관련 문제