2017-02-10 25 views
1

Рассмотрим this patternМожет только возвращаться, а не назначать, Self?

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 
    } 
} 

работает отлично, поэтому

let s = SomeViewControllerClass.make(...) 

это на самом деле возвращает подкласс "SomeViewControllerClass". (. Это не просто 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 helper (sb: sb, id: id)' общий тип заполнителя 'T' выводится из' Self'. - Вы всегда можете переместить дополнительную настройку в вспомогательный метод. –

+0

Или добавьте параметр 'T.Type' в' helper', например, в http://stackoverflow.com/q/37240091/2976878. Затем просто перейдите в 'self' для этого параметра, и' T' будет выведено как 'Self'. – Hamish

+0

Я понимаю, что вы имеете в виду @MartinR, спасибо ... – Fattie

ответ

2

Конечно, есть решение. Именно это делает функция helper.

Почему бы вам не поместить код в helper?

Чтобы вызвать helper, который является общим типом, вы должны указать тип каким-либо образом, например.

let h: Self = helper(...) 

или

let h = helper(...) as Self 

, но ни один из этих выражений фактически принимают Self. Поэтому вам нужно вывести тип из возвращаемого значения -> Self. Вот почему return - единственное, что работает.

Также обратите внимание, что вы можете использовать вспомогательную функцию секунд.

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