2015-01-07 3 views
3

получает сообщение об ошибке в моей детской площадке о том, что набор не соответствует протоколу протокола «ArrayLiteralConvertible»Swift: Тип не соответствует протоколу «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. Это было в старой версии быстро. Он устарел в API iOS 8.1. Вам просто нужен инициализатор выше.

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) 
} 

Это похоже на работу.

Смежные вопросы