2014-10-28 4 views
1

Я определил перечисление, и я хочу использовать его в качестве ключа для словаря. Когда я пытаюсь получить доступ значения с помощью перечисления в качестве ключа, я получаю сообщение об ошибке о перечисление не является конвертируемым в DictionaryIndex<Constants.PieceValue, Array<String>> где Constants.PieceValue это перечисление, который выглядит следующим образом:Перегрузка оператора переполнения переполнения

public enum PieceValue: Int { 
    case Empty = 0, 
    WKing = 16, 
    WQueen = 15, 
    WRook = 14, 
    WBishop = 13, 
    WKnight = 12, 
    WPawn = 11, 
    BKing = 26, 
    BQueen = 25, 
    BRook = 24, 
    BBishop = 23, 
    BKnight = 22, 
    BPawn = 21 
} 

Я прочитал несколько потоков, но не нашли четких ответов. Я также объявил функцию перегрузки оператора для перечисления вне класса Constants.

func == (left:Constants.PieceValue, right:Constants.PieceValue) -> Bool { 
     return Int(left) == Int(right) 
    } 

Это линия, которая Xcode жалуется:

self.label1.text = Constants.pieceMapping[self.pieceValue][0] 

Constants.pieceMapping имеет следующий вид: Dictionary<PieceValue, Array<String>>

ответ

3

Это типичная опциональный проблема: при запросе словаря, он возвращает необязательное значение, чтобы учитывать случаи, когда ключ не найден. Таким образом:

Constants.pieceMapping[self.pieceValue] 

имеет Array<String>? тип. Для того, чтобы получить доступ к этому массиву, сначала нужно разворачивать из необязательных, используя либо принудительные развёртки:

Constants.pieceMapping[Constants.PieceValue.BPawn]![0] 

или более безопасным способом, используя опциональное связывание:

if let array = Constants.pieceMapping[Constants.PieceValue.BPawn] { 
    let elem = array[0] 
} 
+0

Спасибо за подробное объяснение , Было бы неплохо иметь более описательные сообщения об ошибках. – marosoaie

+0

Ну, ошибка описательная, но это не помогает выяснить, что не так :) Есть много таких случаев - обычно, когда это не имеет смысла, это что-то еще – Antonio

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