2017-07-17 95 views
0

我正在創建一個UIView子類,目的是強制用戶使用我所需的init方法,而不是默認的方法。強制用戶使用自定義初始化方法進行初始化

所以,爲此,我爲此創建了一個便捷方法。

@available(*, unavailable, message: "init is unavailable.") 
public override init(frame: CGRect) { 
    super.init(frame: frame) 
} 

required 
convenience public init(withSomeParameters myParam:Type) { 
    self.init(frame: CGRect.zero) 
    //Doing something nice! 
} 

This Works!但是,當我嘗試init時,它向我展示了兩種初始化它的方法。如何強制用戶使用自定義的init方法?

回答

3

你可以把它私有的,所以用戶必須要初始化測試類withSomeParameters

class Test:UIView { 
    private override init(frame: CGRect) { 
     super.init(frame: frame) 
    } 

    convenience public init(withSomeParameters myParam:Type) { 
     self.init(frame: CGRect.zero) 
     //Doing something nice! 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 
} 
0

也許你需要標記的編碼器初始化器不可用,以及:

@available(*, unavailable) 
    required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 
} 

加:刪除您的初始化劑的convenience,並調用超類init(frame:)

public init(withSomeParameters myParam:Type) { 
    super.init(frame: .zero) 
    //Doing something nice! 
} 

再舉一個例子,這裏是一些基地UIView我在很多不使用故事板的項目中使用的子類:

class MXView: UIView { 
    init() { 
    super.init(frame: .zero) 
    } 

    // Storyboards are incompatible with truth and beauty. 
    @available(*, unavailable) 
    required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 
    } 
} 

子類:

class CustomView: MXView { 
    init(someParameters params: Type) { 
    // Phase 1: store ivars. 

    super.init() 

    // Phase 2: Do something nice. 
} 

如果你那樣做的CustomView用戶將被強制使用init(someParamters:)init(frame:)被隱藏,因爲init(someParameters:)是一個不方便的init。