2017-02-13 4 views
0

Я пытаюсь создать класс, который можно охарактеризовать как a) сохранение свойства определенного типа, скажем T, и сохранение свойства другого типа, который может обновить тот же тип, Т. Я думаю, что это лучше объяснить мой (нерабочем) пример:Использование общего типа с протоколом и связанным с ним типом?

protocol Updater { 
    associatedtype UpdateType 
    func update(withSuccess success: ((UpdateType) -> Void)?, failure: ((NSError) -> Void)?) 
} 

class MyContainer<T> { 
    private(set) var object: T 
    private(set) var updater: Updater 
} 

в приведенном выше примере, я хочу, чтобы убедиться, что associatedtype протокола соответствует общему типу myContainer

возможен ли это сделать в стриже?

Thansk!

ответ

0

У вас не может быть объекта недвижимости Updater. Это абстрактно. Вы должны использовать его для ограничения конкретного типа (U в этом случае).

class MyContainer<T, U: Updater> where U.UpdateType == T { 
    private(set) var object: T 
    private(set) var updater: U 
} 

Этот подход может стать утомительным. Предложение where U.UpdateType == T часто распространяется повторно с помощью кода, который использует MyContainer.

Обычно решение является тире-ластиком. Вместо протокола, использовать общие с затворами:

struct Updater<T> { 
    var success: ((T) -> Void)? 
    var failure: ((NSError) -> Void)? 
} 

class MyContainer<T> { 
    private(set) var object: T 
    private(set) var updater: Updater<T> 
} 

Updater конечно можно обернуть один update(withSuccess:withFailure:) метод вместо этого, но разделив его таким образом, часто гораздо лучше на практике.

Смежные вопросы