2017-06-10 71 views
0

我寫了一個協議,如:斯威夫特泛型布爾是無法轉換爲BOOL

public protocol Protocol1 { 
    func execute<T, R>(req: T) -> Promise<R> 
} 
實現如下協議

struct Implemented1 : Protocol1 { 
    func execute<String, Bool>(req : String) -> Promise<Bool> { 
     return Promise<Bool>() { fulfill, reject in 
     fulfill(true) 
    } 
} 

我收到以下錯誤:

「 Bool'不可轉換爲'Bool'

請幫我理解問題所在。

+1

在哪裏出現錯誤?在承諾? Promise在哪裏定義? –

+0

@NateBirkholz錯誤即將到來(true)。 Promise來自PromiseKit –

+1

你可以顯示'Promise'的定義嗎?只是初始化器應該沒問題。 – Sweeper

回答

4

問題在於方法聲明的開始。

func execute<String, Bool> 

誰教你用這種方式聲明泛型方法?

通用參數應該在<> s,而不是實際的類型!

要實現該協議,您需要一個通用方法,而不是一個接受String並返回Bool

所以編譯器將StringBool作爲通用參數的名稱,而不是實際的swift類型。因此,當編譯器說Bool不能轉換爲Bool時,實際上意味着快速Bool類型不能轉換爲通用參數Bool

我認爲你需要的是關聯類型。

public protocol Protocol1 { 
    associatedtype RequestType 
    associatedtype ResultType 
    func execute(req: RequestType) -> Promise<ResultType> 
} 

struct Implemented1 : Protocol1 { 
    typealias ResultType = Bool 
    typealias RequestType = String 
    func execute(req : String) -> Promise<Bool> { 
     return Promise { fulfill, reject in 
      fulfill(true) 
     } 
    } 
} 

P.S.這樣的:

Promise { fulfill, reject in 
    fulfill(true) 
} 

可以簡化爲:

Promise(value: true) 
+0

感謝您糾正我。我相信泛型是我需要了解更多的東西,因爲我發現它在C#中的工作方式不同。我剛開始着手研究快速。 –

+0

只是一個快速查詢。我如何在這個實現中添加一個裝飾器,並且能夠在具有相同服務協議的IOC容器中註冊它? –

+1

對不起,我對IOC容器一無所知。我建議你先做一些研究,然後再發表一個問題。 @BalrajSingh – Sweeper