0
爲什麼這段代碼沒有編譯?Swift的泛型,工具和協議:沒有可訪問的初始化器
編譯錯誤在struct FirmDecoder「return Firm()」中。
錯誤消息是:'公司'不能構造,因爲它沒有可訪問的初始化器。
//: Playground - noun: a place where people can play
import UIKit
protocol EntityDecoder {
func decode<U>(json: [String:AnyObject], index: Int) -> U
}
public struct Firm {
public init(){}
}
struct FirmDecoder : EntityDecoder {
func decode<Firm>(json: [String : AnyObject], index: Int) -> Firm {
return Firm()
}
}
//extension EntityDecoder {
// func decode<Firm>(json: [String : AnyObject], index: Int) -> Firm {
// return Firm()
// }
//}
http://i.stack.imgur.com/q6bAE.png
在此先感謝。
UPDATE @JeremyP @mixel我並不是故意將FirmDecoder.decode()聲明爲通用函數。所以你的「原始答案」就是我試圖達到的目標。
我是否正確地想到,無需爲FirmDecoder實現.decode,我可以制定擴展協議來提供默認實現,因此FirmDecoder只需實現您在更新後的答案中提出的HasInitializer。
喜歡的東西(我沒有訪問的XCode目前):
protocol HasJsonInitializer {
init(json: [String:AnyObject], index: Int)
}
protocol EntityDecoder {
func decode<U: HasJsonInitializer>(json: [String:AnyObject], index: Int) -> U
}
extension EntityDecoder {
func decode<U: HasJsonInitializer>(json: [String : AnyObject], index: Int) -> U {
return U(json, index: index)
}
}
struct FirmDecoder : EntityDecoder, HasJsonInitializer {
init(json: [String:AnyObject], index: Int) {
// json processing
}
}
感謝您的投入。
要添加一些解釋,在這個問題:'解碼'聲明泛型函數和「公司」在這裏被用作任何類型的佔位符,而不是實際的'struct Firm' –
JeremyP
@JeremyP我更新了我的答案,但我不明白你爲什麼使'FirmDecoder.decode()'方法是通用的,你爲什麼期待那'堅強'泛型pa rameter將有沒有參數的初始化器。 – mixel
@Entan對不起,我把你和JeremyP混淆:)如果一切都好,請接受我的答案。 – mixel