是否可以將泛型函數限制爲只有init()產生空對象的類型?例如:如果我使用C.init()
代替Swift(4) - 泛型函數可以針對init()產生「空」對象的類型進行專門化嗎?
error: numbers.playground:3:12: error: non-nominal type 'C' does not support explicit initialization
return C()
^~~
和類似的錯誤:
error: numbers.playground:3:12: error: type 'C' has no member 'init'
return C.init()
^~~~~
似乎有一些協議
public func constructDefaultObject<C>() -> C where C: SomeProtocol {
return C()
}
沒有where
條款,這將產生錯誤提供無參數init
- 例如,RangeReplaceableCollection
和SetAlgebra
都具有產生空的inits集合。但是似乎沒有一個協議涵蓋了所有集合類型的「無參數構造函數創建集合的空實例」的概念。
@BrainHeim什麼是你的了'HasDefaultConstructor'協議的定義是什麼? – Alexander
你想在這裏做什麼?標準庫中不存在代表「* any」類型的協議,該協議可以使用init()初始化;它並不表示關於構造的實例的任何有意義的語義。我強烈建議閱讀https://oleb.net/blog/2016/12/protocols-have-semantics/ – Hamish
@亞歷山大我認爲我在這裏之後的語義或多或少會被認爲是交換幺半羣中的身份元素。對於將是空集合的集合,對於數字類型,它將爲零。這有點專業化,只是「DefaultConstructible」,我應該在我的問題中提到。我會更新。 –