You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 00:54:07