2017-01-10 15 views
6

Uygulamada HTTP isteklerinin yapılmasından sorumlu bir işleve sahibim. Temel olarak, gerekli tüm üstbilgileri, zaman aşımlarını, vb ... ayarlar ... Sonra, istek tamamlandığında, 2 işlevi (geliştirici tarafından sağlanan) çalıştırıyorum: whenSuccess/whenError (sonucun sonucuna bağlı olarak) arama) ve whenComplete (aramanın sonucuna bakılmaksızın). Sonuncusunun whenSuccess işlevinin sonucunu alabilmesini istiyorum. Swift - Genel olmayan bir tanımlama konusunda uzmanlık açılamıyor

Ben

private func doRequest<S>(whenSuccess: (_ json: JSON?)->(S?), 
         whenError: (_ description: String)->(), 
         whenComplete: Optional<(S?)->()>) { 
     // yada yada yada 
} 

Yani, geliştirici bir JSON alır ve genel döndüren bir işlev sağladığından doRequest fonksiyon ilan var. whenError çağrılırsa, whenComplete parametresi olarak nil ile çağrılır.

Ben

doRequest<Int>(whenSuccess: { (json) -> (Int?) in //Cannot specialize a non-generic definition 
      return 5 
}, whenError: { (error) in 

}) { (success) in 

} 

ile hatırlatıyorum hata yorumladı olsun:

herhangi bir fikir bu yapılabilir eğer

olmayan bir jenerik çözünürlüklü uzmanlaşmak olamaz ve Nasıl?

cevap

7

Swift'de, genel işlevleri açık bir şekilde uzmanlaştırmamalısınız. Bunun yerine, genel işlevler otomatik olarak kendi argümanlarından gelen tür çıkarımı yoluyla uzmanlaşırlar.

çağrı bu gibi görünmelidir yapmaya çalışıyoruz sizi: damla, başka deyişle

doRequest(whenSuccess: { json -> Int? in 
    //... 
}, whenError: { error in 
    //... 
}, whenComplete: { success in 
    //... 
}) 
+0

"(json) -> (? Int) 'de" derleyici bunu anlamaya gidiyor çünkü kendi başına. – gnasher729

+3

Hiç de değil. Çağrındaki işlev adından sonra '' bırakın. – werediver

+0

Teşekkürler @werediver, bu hile yaptı! Dilleri anlatabilmek için çabucak gelir ve çabuk gelmek hıçkırıklarına sahiptir. Cevabınızı sadece bir bütünlük için kod parçasıyla düzenlemeye davet ediyorum :) –

İlgili konular