初期化機能のみを含む単純なクラスの初期化子に相当するプロトコルを知りたいのですが、具体的なクラスで拡張することを意図しています。Protocol Extension Initializer
だから、おそらく最も簡単なコードを表示することです - 私は、次のプロトコル拡張と同等を探しています:
import UIKit
class Thing {
var color:UIColor
init(color:UIColor) {
self.color = color
}
}
class NamedThing:Thing {
var name:String
init(name:String,color:UIColor) {
self.name = name
super.init(color:color)
}
}
var namedThing = NamedThing(name: "thing", color: UIColor.blueColor())
私のようなものを見て、コードを期待していた。
protocol Thing {
var color:UIColor {get set}
}
extension Thing {
init(color:UIColor) {
self.color = color
}
}
class NamedThing:Thing {
var name:String
var color:UIColor
init(name:String,color:UIColor) {
self.name = name
self.init(color:color)
}
}
私は他のStackOverflowの質問(例えばHow to define initializers in a protocol extension?)で提案されている解決策を見たことがありますが、クラス初期化子の追加パラメータのこの問題を解決したり、具体的には対応していません。
AnyObjectに準拠冗長で暗黙のうちにアンラップされた名前と色は危険であり、必須ではありません(デフォルト値を設定します) – user3441734
あなたの洞察力のあるコメントをお寄せいただきありがとうございます。問題の価値があるかどうか私はあなたのコメントに同意します。私はプロトコル指向のアプローチで上記の問題のベストプラクティス実装を探していると思います。 varsのデフォルト値を与えるか暗黙的にアンラップする必要がありますが、これはあまり便利でもベストプラクティスでもないようで、プロトコルを使用するような臭いがこの問題の正しい方法ではないかと思います。 @ alain-tコード例であなたのコメントを「代理人クラス」に記入できますか? –
@CraigGrummitt swift内のすべての変数(および/または定数)は、使用する前に値を持たなければなりません(参照型の場合、Swiftではクラス、値は参照、値型ではself)。 Swiftはnullの直接の等価物が存在しません。 var i =任意()にはデフォルト値nilがあります。 VaRのJ = ImplicitlyUnwrappedOptional は() –
user3441734