我正在尝试在 Swift 游乐场中调用一个函数,但它要求我改为声明该函数
I'm trying to call a function in a Swift playground, but it is asking for me to declare the function instead
我已经在 Swift 游乐场的 class 中声明了一个函数,但是当我尝试调用该函数以使用输入对其进行测试时,它的表现就像我正在尝试定义再次运作
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")
}
您不能像 class
那样在 class
的顶层 运行 命令式代码。您应该将此部分移到 外部 Lexer
class 的主体(例如,它正在关闭 }
之外):
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")
请注意,为了 运行 您的代码,您还必须在 getNumber()
的末尾添加一个 return - 可能 return value
我已经在 Swift 游乐场的 class 中声明了一个函数,但是当我尝试调用该函数以使用输入对其进行测试时,它的表现就像我正在尝试定义再次运作
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")
}
您不能像 class
那样在 class
的顶层 运行 命令式代码。您应该将此部分移到 外部 Lexer
class 的主体(例如,它正在关闭 }
之外):
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")
请注意,为了 运行 您的代码,您还必须在 getNumber()
的末尾添加一个 return - 可能 return value