2016-12-26 15 views
1

静的プロパティを公開するプロトコルを構築しようとしていて、そのプロトコルの拡張でその静的プロパティを使用していますが、この静的プロパティをプロトコル拡張同じように。 は基本的に私は仕事に取得しようとしているコード:プロトコル拡張の静的プロパティへのアクセス

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()) 
    } 
} 
+0

静的変数 'bundle'は' String'型ですか?実際のコードを追加しようとすると、問題の解決に役立ちます。変更すると追加のバグが発生する可能性があります。 – user28434

+0

私の悪いですが、タイプは 'Bundle?'(固定)です。実際にはスニペットよりもそれ以上のことはありません。 – axelcdv

+1

これは私のバグのようです - コンパイラは 'UIViewController'の' nibName'インスタンスプロパティと静的 'nibName'プロパティ要件の間に矛盾があると考えています。 [関連するバグ報告](https://bugs.swift.org/browse/SR-2992)を参照してください。単純な解決策は静的な 'nibName'要件の名前を変更することだけです。 – Hamish

答えて

1

これは私にはバグのように見えます(関連するバグレポートSR-2992を参照してください) - :参考のため、ここでコンパイルし、あらゆる問題なく動作するコードのスウィフト2.3バージョンでありますコンパイラはUIViewControllernibNameインスタンスプロパティとNibInstantiableプロトコルのnibName静的プロパティ要件の間に矛盾があると考えています。シンプルな再現性の例は次のようになります。

protocol Foo { 
    static var bar : String { get } 
} 

class Bar { 
    var bar = "" // commenting out this line allows the code to compile 
} 

extension Foo where Self : Bar { 
    static func qux() { 
     print(bar) // compiler error: Instance member 'bar' cannot be used on type 'Self' 
    } 
} 

簡単な回避策は自分のプロトコルのnibName静的プロパティ要件の名前を変更することです。

関連する問題