2017-02-10 8 views
1

は、実際には、サブクラス "SomeViewControllerClass" を返すんので自己のみを返品することはできますか?

let s = SomeViewControllerClass.make(...) 

正常に動作しますthis pattern

extension UIViewController 
{ 
    class func make(sb: String, id: String) -> Self 
    { 
     return helper(sb:sb, id:id) 
    } 

    private class func helper<T>(sb: String,id: String) -> T 
    { 
     let s = UIStoryboard(name: storyboardName, bundle: nil) 
     let c = s.instantiateViewControllerWithIdentifier(id) as! T 
     return c 
    } 
} 

を、考えてみましょう。 (だけでなく、のUIViewController)

すべての罰金です

しかし、

makeに言うあなたは、いくつかのセットアップをしたい:実際には

class func make(sb: String, id: String) -> Self 
    { 
     let h = helper(sb:sb, id:id) 
     // some setup, m.view = blah etc 
     return h 
    } 

あなたがことはできません表示されます。

あなただけ

 return helper(sb:sb, id:id) 

あなたは

 let h = helper(sb:sb, id:id) 
     return h 

することはできません解決策はありますか?

+2

これは、参照パターンの「トリック」です。 'returnヘルパー(sb:sb、id:id)'では、ジェネリックプレースホルダ型 'T'が' Self'から推論されます。 - 追加設定をいつでもヘルパーメソッドに移動できます。 –

+0

あるいは、http://stackoverflow.com/q/37240091/2976878に示されているように、 'helper'に' T.Type'パラメータを追加してください。そのパラメータに 'self'を渡すだけで' T'は 'Self'と推論されます。 – Hamish

+0

私はあなたが何を意味するのか見ています@マーティンR、ありがとう... – Fattie

答えて

2

もちろん解決策があります。それはまさにhelperの機能です。

helperにコードを入れてみませんか?

汎用タイプのhelperを呼び出すには、何らかの形で型を指定する必要があります。

let h: Self = helper(...) 

または

let h = helper(...) as Self 

が、それらの式のどちらも、実際にSelfを受け入れるだろう。したがって、戻り値-> Selfから型を推論する必要があります。だからこそ、returnが機能するのはそのためです。

第2のヘルパー機能を使用することもできます。

class func make(sb: String, id: String) -> Self { 
    let instance = helper2(sb: sb, id: id)   
    return instance 
} 

class func helper2(sb: String, id: String) -> Self { 
    return helper(sb:sb, id:id) 
} 
+0

@JoeBlow 'helper2'はジェネリック型' helper'を推論し、 'make'はその型を直接使うことができます。 – Sulthan

+0

もちろん、あなたはちょうどセットアップコードを "ヘルパー"機能に入れています。良いもの。 – Fattie

+0

どうやって@sulthan - https://stackoverflow.com/questions/44187881標準のiOS回答の種類を探しているのですか?乾杯.. – Fattie

関連する問題