Swift Playground调用类内函数报错要求重新声明如何解决
问题原因
你把evaluate函数的调用代码直接写在了Lexer类的定义作用域内部,Swift的类定义范围内仅允许声明属性、方法、嵌套类型等类成员,不支持直接编写执行语句,所以编译器会误认为你是要定义新的方法,才会报出期望函数体左大括号的错误。
另外你当前声明的evaluate是Lexer的实例方法,它本身不需要依赖外部传入的实例状态,完全可以声明为静态方法直接通过类调用。
解决方法
- 将
evaluate("10 + 3 + 5")、evaluate("1 + 2 + abcdefg")这两行调用代码移动到Lexer类结束的大括号}之外 - 给
evaluate方法添加static修饰符,将它改为类的静态方法,就可以直接通过类名调用 - 补充原
getNumber方法缺失的末尾返回逻辑,避免极端情况编译报错
修正后的完整代码
import Cocoa enum Token { case number(Int) case plus } class Lexer { enum Error: Swift.Error { case invalidCharacter(Character) } let input: String var position: String.Index init(input: String) { self.input = input self.position = input.startIndex } func peek() -> Character? { guard position < input.endIndex else { return nil } return input[position] } func advance() { assert(position < input.endIndex, "Cannot advance past endIndex!") position = input.index(after: position) } func getNumber() -> Int { var value = 0 while let nextCharacter = peek() { switch nextCharacter { case "0" ... "9": let digitValue = Int(String(nextCharacter))! value = 10*value + digitValue advance() default: return value } } // 补充遍历到字符串末尾的返回逻辑 return value } func lex() throws -> [Token] { var tokens = [Token]() while let nextCharacter = peek() { switch nextCharacter { case "0" ... "9": let value = getNumber() tokens.append(.number(value)) case "+": tokens.append(.plus) advance() case " ": advance() default: throw Lexer.Error.invalidCharacter(nextCharacter) } } return tokens } // 添加static修饰符改为静态方法 static func evaluate(_ input: String) { print("Evaluating: \(input)") let lexer = Lexer(input: input) do { let tokens = try lexer.lex() print("Lexer output: \(tokens)") } catch { print("An error occurred: \(error)") } } } // 调用代码移到类外部,通过类名调用静态方法 Lexer.evaluate("10 + 3 + 5") Lexer.evaluate("1 + 2 + abcdefg")
运行输出
Evaluating: 10 + 3 + 5 Lexer output: [Token.number(10), Token.plus, Token.number(3), Token.plus, Token.number(5)] Evaluating: 1 + 2 + abcdefg An error occurred: invalidCharacter("a")
内容的提问来源于stack exchange,提问作者gnarlee
相关产品推荐
相关产品推荐

