2016-04-25 38 views
11

Swift 2 ve Xcode 7.3 ile bir proje üzerinde çalışıyorum ve bunun nedenini henüz anlayamadığım bir hatayla karşılaşıyorum.Swift: EXC_BAD_ACCESS protokolu uygulayan bir jenerik türden bir yöntemi çağırıyor

Bu tür bir associatedtype ve static var olan Resource adlı bir protokol oluşturdum. onun uzantısı İçinde

, ben tip başka ResourceFinderProtocol denilen uygulayan bir jenerik struct olan static var 'ın getter, bir varsayılan uygulaması oluşturmak çalışıyorum.

Her şey iyi derlenir, ancak çalışma zamanında, aşağıdaki kod parçasının son satırı yürütülürken, bir EXC_BAD_ACCESS kilitlenme üretir.

Genel olmayan struct ResourceFinder yaparsanız, sorunsuz çalışır.

protocol Resource { 
    associatedtype ResourceFinderType 
    static var localObjects: ResourceFinderType { get } 
} 

extension Resource { 
    static var localObjects: ResourceFinder<Self> { 
     return ResourceFinder() 
    } 
} 

public protocol ResourceFinderProtocol { 
    associatedtype ResourceType 
    func all() -> [ResourceType] 
} 

struct ResourceFinder<T:Resource>: ResourceFinderProtocol { 
    func all() -> [T] { 
     return [] 
    } 
} 

struct Model: Resource {} 

Model.localObjects.all() 

Burada neler olabileceğine dair herhangi bir fikir var mı?

DÜZENLEME:

let localObjects = Model.localObjects 
let allObjects = localObjects.all() 

... hala ilk satırda çöküyor: Alexander gibi

İçine çağrı bölünmüş olsa bile, dikkat çekti.

+0

aracılığıyla takip edebilirsiniz, 'Model.localObjects' da çöker. –

cevap

5

localObjects özelliğine erişilirken yığın taşmasıyla sonuçlanan bir derleyici hatasıdır. Toplayabildiğim kadarıyla, türler arasında özyineleşen bir bağımlılık sorunu var ve daha spesifik olarak localObjects dinamik gönderim yoluyla çağrılır. static var localObjects: ResourceFinderType { get }'u Resource'dan kaldırırsam çalışır.

Alternatif olarak, Resource kısıtlamasını ResourceFinder'dan kaldırırsanız, aynı zamanda başarılı bir şekilde çalışır.

Sorunu bildirdin ve arada SR-1314

+1

Sorunu bildirdiğiniz için teşekkürler, Stuart. Usta üzerinde sabitlendiği anlaşılan haliyle zaten işaretlendi. Yani düzeltme sonraki sürümde geliyor. –

+2

Ben de 04-25 3.0 SNAPSHOT ile birlikte çalıştığını doğruladı –

İlgili konular