首页 > 解决方案 > 我试图在 Swift 操场上调用一个函数,但它要求我声明该函数

问题描述

我已经在 Swift 操场的一个类中声明了一个函数,但是当我尝试调用该函数以使用输入对其进行测试时,它就像我试图再次定义该函数一样

    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)")
        }
    }
    evaluate("10 + 3 + 5")
    evaluate("1 + 2 + abcdefg")

它特别给出了错误:“函数声明体中的预期'{'”我如何让它运行函数?

这是整个代码:

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

    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
    }

    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)")
        }
    }
    evaluate("10 + 3 + 5")
    evaluate("1 + 2 + abcdefg")
}

标签: swiftmacosswift-playground

解决方案


你不能像你试图做evaluate(...)的那样在顶层运行命令式代码。class您应该将此部分移到课程主体之外Lexer(例如,在它正在关闭的之外}):

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

evaluate("10 + 3 + 5")
evaluate("1 + 2 + abcdefg")

请注意,为了运行您的代码,您还必须在末尾添加一个 return getNumber()-- 可能return value


推荐阅读