olmayabilir jenerik türüne [AnyObject] dökme T
ihtiva edebilir veya bir dizi olmayabilir.genel bir tür I <code>AnyObject</code> bir dizi bilgisi, ve döküm mi (veya nesneler <em>bir</em>) olur veya bir toplama tipi
ilk denemesi: T
bir Array
(örneğin T.self == Array<SomeObject>.self
) olduğu zaman
class MyClass<T> {
func someMethod() -> T? {
let anyObjectArray: [AnyObject] = // ... array obtained from Objective-C framework
if let objectsAsCollection = anyObjectArray as? T { // Cast always fails
return objectsAsCollection
} else if let firstObject = anyObjectArray.first as? T {
return firstObject
} else {
return nil
}
}
}
ilk if let
döküm başarısız olur.
Böyle bir şey denemek istiyorum, ama bu yazılı şekilde geçerli değil, her nasılsa başka jenerik parametreyi tanıtan içerir:
extension MyClass where T == Array<U> {
fun someMethod() -> T? {
let anyObjectArray: [AnyObject] = // ... array obtained from Objective-C framework
if let objectsAsCollection = anyObjectArray.flatMap({ $0 as? U }) {
return objectsAsCollection
} else if let firstObject = anyObjectArray.first as? T {
return firstObject
} else {
return nil
}
}
}
Bunu yapmak isteyen nedeni kullanıyorum olmasıdır REST API'sından sonuç almak için bir Object-C çerçevesi (RestKit). Ben bu sonuçlar geri yapıldığı isteğine bağlı olarak belirli bir türü olarak geçer Swift de üzerinde bir tabaka inşa ediyorum, bu yüzden şuna benzer bir Result
türü var: Bazen
enum Result<T>: {
case Success(T)
case Failure(Error)
}
T
tek olduğunu Nesne, bazen nesnelerin bir dizisidir, ancak Objective-C çerçevesi her zaman sonuçları bir dizi olarak döndürür.
tartışılan hata başka örneği gibi görünüyor. bunların nasıl bir yerli Swift türünde bir diziye döküm yapılacak gibidir: Ör senin '[AnyObject]' 'NSString' yanı sıra' NSNumber' örneklerini tutan diyor? demek, bir genel kullanarak, genel olarak, unutmayın, 't', farklı tipleri yöntemi çağırmak için, izin verir, ancak bu tür her bir çağrı için, 't' tek tip olarak sabitlenir. AnyObject dizisinin her zaman sadece aynı türde nesneler içereceğini kesin olarak biliyor musunuz? – dfri
'AnyObject' dizi teorik olarak herhangi bir tipini içerebilir Amaç-Cı çerçeve dönen @dfri. Ancak, gerçekte Her çağrı için yani kalan API belirli tipte bir dizi döner biliyoruz, 't' 'ya SomeType' veya 'Dizi' (burada' SomeType' iade edilen nesnenin türüne bağlı olarak değişir sunucu tarafından). –
Stuart
ben başkasıyla geçenlerde tam olarak aynı sorunu değerlendiriyordu düşünüyoruz ve NSArray' 'ile' [AnyObject] 'değiştirerek çözüldü. – Sulthan