2017-08-08 32 views
2

是否可以將泛型函數限制爲只有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 - 例如,RangeReplaceableCollectionSetAlgebra都具有產生空的inits集合。但是似乎沒有一個協議涵蓋了所有集合類型的「無參數構造函數創建集合的空實例」的概念。

+0

@BrainHeim什麼是你的了'HasDefaultConstructor'協議的定義是什麼? – Alexander

+1

你想在這裏做什麼?標準庫中不存在代表「* any」類型的協議,該協議可以使用init()初始化;它並不表示關於構造的實例的任何有意義的語義。我強烈建議閱讀https://oleb.net/blog/2016/12/protocols-have-semantics/ – Hamish

+0

@亞歷山大我認爲我在這裏之後的語義或多或少會被認爲是交換幺半羣中的身份元素。對於將是空集合的集合,對於數字類型,它將爲零。這有點專業化,只是「DefaultConstructible」,我應該在我的問題中提到。我會更新。 –

回答

1

是的,這是可能的,但它沒多大用處:

// This is a shitty protocol that doesn't do much. Don't use it. 
public protocol DefaultConstructible { 
    init() 
} 

public func constructDefaultObject<C>() -> C where C: DefaultConstructible { 
    return C() 
} 
+0

我認爲這回答了原始問題,但不是我在評論中修改和討論後。謝謝你的想法,但這非常有幫助。 :) –

+0

@BrianHeim在這種情況下,開一個新的問題。移動這樣的目標職位使評論/答案解除同步和困惑 – Alexander

+0

感謝您的努力@亞歷山大,你的回答幫助我找出了我的問題。 – applejack42

相關問題