2017-08-14 30 views
3

似乎荒謬,這種方法的簽名不斯威夫特4編譯:爲什麼Where子句只對具有泛型參數的函數有效?

class Bar<ValueType> { 
    func version() throws -> String where ValueType == [String: Any] { ... } 
} 

(錯誤:WHERE子句不能連接到非通用聲明)
但這編譯罰款:

class Bar<ValueType> { 
    func version<T>(_ foo: T? = nil) throws -> String where ValueType == [String: Any] { ... } 
} 

任何人都知道爲什麼會出現這種情況?

回答

1

由於ValueType無關用這種方法(在第一個例子)。這將是錯誤的把這種方法的類型(class/struct/enum),因爲它不是真正那種真正的一員。它有條件地是該類型的成員,具體取決於where子句的真值。

要做到這一點,你會希望把這個方法在你的類型的擴展,你想要的where條款。例如。

extension YourType where ValueType == [String: Any] { 
    func version() throws -> String { ... } 
} 
+0

限制使用where子句是爲了實施最佳實踐而不是編譯器限制嗎? –

+0

@SidMani不,這只是一個意味着什麼類型的聲明體內被發現的功能後果。這意味着函數是一種存在於類型上的方法。你所擁有的不是存在於該類型上的方法。你有一個方法可以*可能存在於這個類型上。 – Alexander

+0

@SidMani規則可以做到這一點,這是可能的,但它將是一個完整的狗屎表演。對於你看到的每一種方法,你都必須檢查相關的where子句來查看該方法是否適用。這可能是大量方法的情況,這些方法全部共享相同的where子句。這是非常雜亂,和不必要的複雜 – Alexander

相關問題