2017-04-06 175 views
2

我試圖讓nil爲零索引元素,其餘的將具有通用類型T的值,即Comparable如何用零初始化Swift數組

所以,當我初始化它會nil它按預期工作

struct Container<T: Comparable> { 
    var container = [T?]() 

    init() { 
     container.append(nil) 
    } 
} 

但是當我與一個整數做說0,我得到ambiguous reference

struct Container<T: Comparable> { 
    var container = [T?]() 

    init() { 
     container.append(0) 
    } 
} 

Playground execution failed: error: Algorithms.playground:7:9: error: ambiguous reference to member 'append' 
     container.append(0) 
     ^~~~~~~~~ 

我想知道爲什麼這個錯誤正在發生?

+1

'T'是沒有必要的'Int' - 它可能是'String'和'0'不能被添加到'[字符串?]'。 – Hamish

回答

1

T可以通過任何可比類型(String,自定義類型,...),和 從0初始化它不是通常 可能的。

您可以要求T可以從字面整數創建, 這涵蓋了所有的整數和浮點類型:

struct Container<T: Comparable> where T: ExpressibleByIntegerLiteral { 
    var container = [T?]() 

    init() { 
     container.append(0) 
    } 
} 

,或者提供一個單獨的append()方法:

struct Container<T: Comparable> { 
    var container = [T?]() 

    init() { 
     container.append(nil) 
    } 

    mutating func append(_ newElement: T) { 
     container.append(newElement) 
    } 
} 

var c = Container<Int>() 
c.append(0) 
+0

這是否違背了將容器作爲泛型的目的? –

+0

@RajeevBhatia:它仍然是通用的,僅限於一組受限類型。如果你不限制它,那麼'append(0)'是沒有意義的。 –

+0

@MartinR我雖然數組應該有'append'方法,如果我提供'T'類型的文字,那麼它應該像它應該的那樣工作。 – Rahul

2

問題是T: Comparable不一定是指詮釋,它意味着任何值符合Comparable,其中包括String,Float,Bool,以及其他程序員爲自己的項目編寫的數千個自定義結構。

由於0不是所有這些的Structs的一個有效的值,你實際上有兩個問題之一:

1)我其實只是想集裝箱始終使用Int - 在這種情況下:

struct Container 
{ 
    var container: [Int?] 

    init() 
    { 
     container = [nil] 
    } 
} 

var a = Container() 
a.container.append (0) 

2)爲什麼我使用0,當我的意思nil

struct Container<T: Comparable> 
{ 
    var container: [T?] 

    init() 
    { 
     container = [nil] 
    } 
} 

var a = Container<Int>() 
a.container.append (0)