2015-05-18 2 views
3

Вопрос в заголовке. В Objective-C, если я хочу иметь свойство (например, делегат), что ИМЕЕТ придерживаться определенного протокола может быть определена следующим образом:Свифт эквивалент id <MyProtocol>?

@property (weak) id<MyDelegate> delegate; 

Как я могу сделать это в Swift?

+3

здесь: https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html#//apple_ref/doc/uid/TP40014097-CH25 -ID267 – Moritz

ответ

17

Протокол является типом, поэтому вы можете использовать его как объявленный тип переменной. Чтобы использовать weak, вы должны обернуть этот тип как необязательный. Таким образом, вы сказали бы:

weak var delegate : MyDelegate? 

Но для того, чтобы это работало, MyDelegate должен быть протокол @objc или class для того, чтобы гарантировать, что усыновитель является классом (а не структура или перечисление, поскольку они не могут быть weak).

+1

И посмотрите мою книгу для получения дополнительной информации: http://www.apeth.com/swiftBook/ch05.html#_memory_management_of_protocol_typed_references – matt

0

Используйте протокол, как тип, так:

weak var delegate:MyDelegate? 
+1

Слабые переменные всегда должны быть необязательного типа. – fluidsonic

+0

@fluidsonic Да конечно - отредактирует. –

1

Я думаю, что точная oposite является:

weak var delegate: protocol<MyDelegate>? 

Я предпочитаю этот старый, ObjC, стиль над быстрым синтаксисом, потому что в стриже первым это базовый класс, а затем все принятые протоколы. Это может сбивать с толку, если ваш протокол не имеет суффикса «Делегат», поскольку вы не знаете, является ли DataAdoption (например) суперклассом или протоколом.

0

Также полезно знать эквивалент объекта Objective-C id<MyProtocolName> в декларации метода в Swift: protocol<MyProtocolName>. Например:

// Objective-C 
-void myMethodWithSome:(id <MyProtocolName>)param { 
    // ... 
} 

// Swift 
func myMethodWithSome(param: protocol<MyProtocolName>) { 
    //... 
} 
Смежные вопросы