2017-07-17 98 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。