2016-08-31 5 views
0

Я хочу использовать слабые ссылки в общих структурах данных; в примере ниже массива, но в общем случае какой-либо общий тип. Я почти получить его работать :(Как вы можете использовать слабые ссылки в структуре данных Swift, типизированных как протокол?

Мои эксперименты начались хорошо, следующие работы:

// Array of weak references OK 
struct WeakReference<T: AnyObject> { 
    weak var value: T? 
} 
class C { 
    var i: Int = 0 
} 
let c = C() // Strong reference to prevent collection 
let weakCs = [WeakReference(value: c)] // OK 
print("C: \(weakCs[0].value!.i)") // 0 

Я могу добавить протокол:

// Array of weak references that implements a protocol OK 
protocol P: AnyObject { // Note AnyObject 
    var i: Int { get } 
} 
class CP: P { 
    var i: Int = 0 
} 
let cP = CP() // Strong reference to prevent collection 
let weakCPs = [WeakReference(value: cP)] // OK 
print("CP: \(weakCPs[0].value!.i)") // 0 

Но когда я хочу массив слабых ссылок на протокол Я получаю сообщение об ошибке:

// Array of weak references of a protocol not OK 
let weakPs: [WeakReference<P>] = [WeakReference(value: cP)] // Using 'P' as 
a concrete type conforming to protocol 'AnyObject' is not supported 
print("P: \(weakPs[0].value!.i)") // 0 

Есть ли что-то, что я вы пропустили?

Сообщение об ошибке «Использование« P »в качестве конкретного типа, соответствующее протоколу « AnyObject »не поддерживается», подразумевает, что это временное ограничение компилятора. Это будет исправлено? Должен ли я подавать сообщение об ошибке?

Заранее спасибо за любые советы,

- Говард.

ответ

0

Игра вокруг я обнаружил, что:

// Array of weak references of a protocol OK so long as protocol marked @objc 
@objc protocol P { // Note @objc 
    var i: Int { get } 
} 
class CP: P { 
    var i: Int = 0 
} 
let weakPs: [WeakReference<P>] = [WeakReference(value: cP)] // Note typed as `[WeakReference<P>]` 
print("P: \(weakPs[0].value!.i)") // 0 

работа :)

Это раздражает, что вы должны использовать @objc и, следовательно, не является чисто Swift решения, но так как я на прошивкой не проблема для меня.