2016-04-16 22 views
0

私はより安全なインスタンス化ビューコントローラUIStoryboard延長

protocol IdentifierType { 
    typealias Identifier: RawRepresentable 
} 

extension IdentifierType where Self: UIStoryboard, Identifier.RawValue == String { 

    func instantiateViewControllerWithIdentifier(identifier:Identifier) -> UIViewController { 
     return self.instantiateViewControllerWithIdentifier(identifier.rawValue) 
    } 

} 

するために、迅速でストーリーボードの拡張機能を作成しようとすることだし、それはコンパイル時にエラーをすることはありません。しかし、私がそれを実装しようとすると:

extension UIStoryboard : IdentifierType { 
    enum Identifier: String { 
     case MainViewController = "MAIN_VIEW_CONTROLLER" 
     case ContactUsViewController = "CONTACT_US_VIEW_CONTROLLER" 
     case AboutViewController = "ABOUT_VIEW_CONTROLLER" 
    } 
} 

コンパイル時エラーが発生します。

答えて

1

「『識別子』はこのコンテキストで型のルックアップのためのambituousである」あなたが何かのように言うことができる:あなたは、あなたが望むものであるself.storyboard?.instantiateViewControllerWithIdentifier(.ContactUsViewController)のようなものを呼び出すことができます

protocol IdentifierType { 
    associatedtype Identifier: RawRepresentable 
} 

extension UIStoryboard : IdentifierType { 
    enum Identifier: String { 
     case MainViewController = "MAIN_VIEW_CONTROLLER" 
     case ContactUsViewController = "CONTACT_US_VIEW_CONTROLLER" 
     case AboutViewController = "ABOUT_VIEW_CONTROLLER" 
    } 

    func instantiateViewControllerWithIdentifier(identifier:Identifier) -> UIViewController { 
     return self.instantiateViewControllerWithIdentifier(identifier.rawValue) 
    } 
} 

この場合、RawRepresentableのメリットがわからない場合は、その理由を説明できる理由を説明できます。

しかし、これはあなたが単純化することができるように、プロトコルIdentifierTypeは、完全に不必要であるあなたが必要なものがすべてであると仮定すると:あなたが迅速herehere.

に列挙型でハードコードされた文字列を取り除くの議論を見つけることができます

extension UIStoryboard { 
    enum Identifier: String { 
     case MainViewController = "MAIN_VIEW_CONTROLLER" 
     case ContactUsViewController = "CONTACT_US_VIEW_CONTROLLER" 
     case AboutViewController = "ABOUT_VIEW_CONTROLLER" 
    } 

    func instantiateViewControllerWithIdentifier(identifier:Identifier) -> UIViewController { 
     return self.instantiateViewControllerWithIdentifier(identifier.rawValue) 
    } 
} 

+0

ありがとうございます。それはとても簡単です。それは私の場合に適用することができます。私はUIImageとUIViewControllersでsegueIdentifierとして実装しているので、識別子プロトコルを作成します。 –