62
protocol Car {
     var wheels : Int { get set}

     init(wheels: Int)

}

extension Car {
    init(wheels: Int) {
        self.wheels = wheels
    }
}

self.wheels = wheel でエラーが発生します

Error: variable 'self' passed by reference before being initialized

プロトコル拡張で初期化子を定義するにはどうすればよいですか?

4

4 に答える 4

5

@Qbyteは正しいです。

さらに、私のConfigurableを見ることができます

その中で私はInitableプロトコルを持っています

public protocol Initable {
    // To make init in protocol extension work
    init()
}

public extension Initable {
    public init(@noescape block: Self -> Void) {
        self.init()
        block(self)
    }
}

あとはそれに合わせるために

extension Robot: Initable { }

final使用または実装の2つの方法がありますinit

final class Robot {
    var name: String?
    var cute = false
}

class Robot {
    var name: String?
    var cute = false

    required init() {

    }
}
于 2015-12-30T04:35:13.333 に答える
2

同じではないかもしれませんが、私の場合、init を使用する代わりに、静的関数を使用してクラスのオブジェクトを返しました。

protocol Serializable {
   static func object(fromJSON json:JSON) -> AnyObject?
}

class User {
    let name:String

    init(name:String) {
        self.name = name
    }
}

extension User:Serializable {

    static func object(fromJSON json:JSON) -> AnyObject? {
        guard let name = json["name"] else {
            return nil
        }

        return User(name:name)
     }

}

次に、オブジェクトを作成するには、次のようにします。

let user = User.object(fromJSON:json) as? User

これまでで最高のものではないことはわかっていますが、ビジネスモデルをデータレイヤーと結び付けないために見つけた最高のソリューションです.

注:私は怠け者で、すべてをコメントに直接コーディングしたので、うまくいかない場合はお知らせください。

于 2016-05-20T08:51:15.357 に答える