swift - 我试图在 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")
}
解决方案
你不能像你试图做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
推荐阅读
- makefile - 为什么makefile不能正常工作?
- jquery - 如何检索被黑的 wordpress 网站
- java - 在 Java 中存储 ECS 的组件
- javascript - 带有特殊字符的单词无法正确呈现。Javascript有办法吗?
- python - 需要帮助在 Django 中编写单元测试
- python - 无法安装熊猫(错误:无法卸载“numpy”)
- spring-boot - 如何回滚微服务
- angular - 找不到名称为“create_param[0]”的控件
- laravel - Laravel 路由地址
- spring-boot - Spring Boot 安全性引发错误,状态为 999“无可用消息”