0

ここに奇妙なバグがあります。

ビューにいくつかのカスタム プロパティを渡すために UIImageView をサブクラス化しています。サブクラスに init メソッドを追加しなければ、すべて問題ありません。

しかし、init を追加すると (そうする必要があります)、フレーム ビューを作成しているときに、コンパイラは Int が CGFloat に変換できないと文句を言います。

Le init を使用した Le サブクラス:

class CustomUIImageView : UIImageView {


let someParameter : Bool

init(someParameter: Bool) {
    self.someParameter = someParameter
    println("\(someParameter) is being initialized")
}

//Since the release of the GM version of XCode 6, it's asking me to pass this init below 
//if I'm initializing a value. Frankly, I've no idea why, what's for nor what should I do about it. 
required init(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

deinit {
    println("\(someParameter) is being deinitialized")
}
}

フレーム作成時のエラーとル。

 var myView: CustomUIImageView!
 myView = CustomUIImageView(frame: (CGRectMake(0, 0, 100, 100)))
 //compiler says "Int is not convertible to CGFloat". 

これはある種のバグですか、それとも私が何か間違ったことをしたのでしょうか (これは非常にもっともらしいことです)。

編集:次のようにして CGFloat に直接変換する必要があることを読みました: myView = CustomUIImageView(frame: (CGRectMake(CGFloat(0), 0, 100, 100))) しかし、コンパイラは「Type () がプロトコル 'IntergerLiteralConvertible' に準拠していません」と再び不平を言います。

4

1 に答える 1

0

init で、親イニシャライザを呼び出すのを忘れました:

init(someParameter: Bool) {
    self.someParameter = someParameter
    println("\(someParameter) is being initialized")

    super.init() // << this is missing
}

ただし、必要であるが明示的に言われていない別の初期化子があるようです:

override init(frame: CGRect) {
    self.someParameter = false
    super.init(frame: frame)
}

これでコンパイルの問題は解決するはずです。残りは、クラスに実装されているプロパティを初期化する方法を考え出すことです。オプションを使用する必要があるかもしれません。

于 2014-09-20T17:14:56.800 に答える