静的プロパティを公開するプロトコルを構築しようとしていて、そのプロトコルの拡張でその静的プロパティを使用していますが、この静的プロパティをプロトコル拡張同じように。 は基本的に私は仕事に取得しようとしているコード:プロトコル拡張の静的プロパティへのアクセス
protocol NibInstantiable: class {
static var bundle: Bundle? { get }
static var nibName: String { get }
}
extension NibInstantiable where Self: UIViewController {
// static var nibName: String {
// return ""
// }
static func instantiate() -> Self {
return Self(nibName: Self.nibName, bundle: Self.bundle ?? Bundle.main)
}
}
これはそのままですスウィフト2で基本的に動作するように使用されていないが、それはもはや、私はそれがコメント解除で仕事を得ることができスウィフト3の場合ですプロトコル拡張のnibName
プロパティですが、このプロトコルを実装するクラスでこのプロパティを定義するのを忘れた場合、コンパイラの警告が表示されません。
私が迷っているものは何ですか? ありがとう!
EDIT:
protocol Instantiable {
static var bundle: NSBundle? { get }
static func instantiate() -> Self
}
extension Instantiable {
static var bundle: NSBundle? {
return NSBundle.mainBundle()
}
}
// MARK: With Nib
protocol NibInstantiable: Instantiable {
static var nibName: String { get }
}
extension NibInstantiable where Self: UIViewController {
static func instantiate() -> Self {
return Self(nibName: Self.nibName, bundle: Self.bundle ?? NSBundle.mainBundle())
}
}
静的変数 'bundle'は' String'型ですか?実際のコードを追加しようとすると、問題の解決に役立ちます。変更すると追加のバグが発生する可能性があります。 – user28434
私の悪いですが、タイプは 'Bundle?'(固定)です。実際にはスニペットよりもそれ以上のことはありません。 – axelcdv
これは私のバグのようです - コンパイラは 'UIViewController'の' nibName'インスタンスプロパティと静的 'nibName'プロパティ要件の間に矛盾があると考えています。 [関連するバグ報告](https://bugs.swift.org/browse/SR-2992)を参照してください。単純な解決策は静的な 'nibName'要件の名前を変更することだけです。 – Hamish