2015-01-07 73 views
3

不斷收到在我的操場說,設置不符合協議「ArrayLiteralConvertible」斯威夫特:類型不符合協議「ArrayLiteralConvertible」


struct Set<T: Hashable> : ArrayLiteralConvertible { 
    typealias Element = T 
    private var contents: [Element: Bool] 

    init() { 
     self.contents = [Element: Bool]() 
    } 

    // easier initialization 
    init<S: SequenceType where S.Generator.Element == Element>(_ sequence: S) { 
     self.contents = [Element: Bool]() 
     Swift.map(sequence) { self.contents[$0] = true } 
    } 

    // allow Set creation through simple assignment using ArrayLiteralConvertible protocol 
    internal static func convertFromArrayLiteral(elements: Element...) -> Set { 
     return Set(elements) 
    } 
} 

回答

4

ArrayLiteralConvertible需要您實現init(arrayLiteral: Element...)類型的初始化。這樣的事情會重複使用您的初始化,需要一個序列:

init(arrayLiteral: Element...) { 
    self = Set(arrayLiteral) 
} 

如果你在操場做這個,創下選擇-CMD輸入到看到助理編輯更多的細節比你剛剛得到源中的錯誤消息。它顯示了您未見面的所有協議要求的細節。

順便說一句,如果你聲明的內容是這樣的:

private var contents: [Element: Bool] = [:] 

你就不需要在每個初始化的初始化它。

+0

以前沒看過那個鍵盤快捷鍵,謝謝! –

1

ArrayLiteralConvertible協議出錯,需要一個初始化init(arrayLiteral elements: Element...)在類

init(arrayLiteral elements: Element...) { 
    self = Set(elements) 
} 

您不需要再實現convertFromArrayLiteral函數。這是在舊版本的迅速。它在iOS 8.1 API中已被棄用。你只需要上面的初始化器。

https://developer.apple.com/library/ios/releasenotes/General/iOS81APIDiffs/modules/Swift.html

http://swiftdoc.org/protocol/ArrayLiteralConvertible/

0

謝謝,你讓我走上正軌。我在github上發現了一些基於語法的ArrayLiteralConvertible變化的要點。它去了這個調:

init(arrayLiteral elements: T...) { 
     self.init(elements) 
} 

這似乎工作。

相關問題