2016-11-30 3 views
0

В классе лексером, то «положение» переменная определена как:Печать значение значения «» String.CharacterView.Index

class Lexer { 
    enum myError: Error { 
    case InvalidCharacter(Character,String.CharacterView.Index) 
    } 
    let input: String.CharacterView 
    var position: String.CharacterView.Index 
    init(input: String) { 
    self.input = input.characters 
    self.position = self.input.startIndex 
    } 

В выходном коде:

func evaluate(input: String) { 
print("Evaluating: (input)") 

let lexer = Lexer(input: input) 

do { 
let tokens = try lexer.lex() 
print("Lexer output: (tokens)") 

let parser = Parser(tokens: tokens) 
let result = try parser.parse() 
print("Parser output: \(result)") 
} catch Lexer.myError.InvalidCharacter(let character) { 
print("Input contained an invalid character at index (lexer.position): (character)") 
} catch Parser.myError.UnexpectedEndOfInput { 
print("Unexpected end of input during parsing at index (lexer.position)") 
} catch Parser.myError.InvalidToken(let token) { 
print("Invalid token during parsing at index (lexer.position): (token)") 
} catch { // catches any remaining errors to fulfill requirement of exhaustive handling 
print("An error occurred: (error)") 
} 
} // end evaluate 

evaluate(input: "10a + 3") 

Результат это:

Оценка: 10a + 3 вход содержал недопустимый символ с индексом Index (основание: Swift.String.UnicodeScalarView.Index (позиция: 2), _countUTF16: 1): а

Я не могу найти способ распечатать значение как простое целое число. Продолжайте получать строку с ошибкой, которая даже включает значение, которое я пытаюсь получить.

ответ

0

В Swift String.CharacterView.Index не является целым числом, поэтому вы не можете ожидать, что напечатанный вывод будет простым целым числом.

Если вам нужно распечатать целочисленное значение, представляющее String.CharacterView.Index, вам явно необходимо его вычислить.

Например:

class Lexer { 
    //... 

    var offset: Int { 
     return self.input.distance(from: self.input.startIndex, to: self.position) 
    } 
} 

Определить вычисленное свойство, которое возвращает Int и использовать lexer.offset вместо lexer.position.

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