2015-10-01 67 views
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 
    } 
} 

感謝您的投入。

回答

1

UPDATE

如果你想不保持decode<U>作爲通用的功能,那麼你應該約束添加到該說U必須有一個不帶參數初始化泛型參數U

protocol HasInitializer { 
    init() 
} 

protocol EntityDecoder { 
    func decode<U: HasInitializer>(json: [String:AnyObject], index: Int) -> U 
} 

struct FirmDecoder : EntityDecoder { 
    func decode<Firm: HasInitializer>(json: [String : AnyObject], index: Int) -> Firm { 
     return Firm() 
    } 
} 

,做泛型參數和結構不使用相同的名稱Firm。這很混亂。

原來的答案

EntityDecoderFirmDecoder定義是無效的,這是正確的方式:

import UIKit 
protocol EntityDecoder { 
    typealias U 
    func decode(json: [String:AnyObject], index: Int) -> U 
} 

public struct Firm { 
    public init() {} 
} 

struct FirmDecoder : EntityDecoder { 
    func decode(json: [String : AnyObject], index: Int) -> Firm { 
     return Firm() 
    } 
} 
+0

要添加一些解釋,在這個問題:'解碼'聲明泛型函數和「公司」在這裏被用作任何類型的佔位符,而不是實際的'struct Firm' – JeremyP

+0

@JeremyP我更新了我的答案,但我不明白你爲什麼使'FirmDecoder.decode()'方法是通用的,你爲什麼期待那'堅強'泛型pa rameter將有沒有參數的初始化器。 – mixel

+0

@Entan對不起,我把你和JeremyP混淆:)如果一切都好,請接受我的答案。 – mixel