Swift 错误:参数类型double/string等不符合预期类型";“任何对象”;

Swift 错误:参数类型double/string等不符合预期类型";“任何对象”;,swift,Swift,我看了一些iOS编程教程,对“AnyObject”有一个问题。 桥接不起作用。 我有以下代码: import Foundation class CalculatorBrain { private var accumulator = 0.0 var internalProgram = [AnyObject]() func setOperand (operand: Double) { accumulator = operand intern

我看了一些iOS编程教程,对“AnyObject”有一个问题。 桥接不起作用。 我有以下代码:

import Foundation

class CalculatorBrain
{
    private var accumulator = 0.0
    var internalProgram = [AnyObject]()

    func setOperand (operand: Double) {
        accumulator = operand
        internalProgram.append(operand)
    }
    // ...
}
字符串也一样

func performOperation (symbol: String) {
    internalProgram.append(symbol)
} 
我知道
NSString
和引用类型vs.struct,double和string不是引用类型。 但无论如何,在教程中,桥接效果很好。。。
我失败的原因可能是什么?

要将Swift值类型用作
任何对象,在Swift 3中,需要显式将其转换为旧的Objective-C对象类型

那么这个

internalProgram.append(operand)
变成这样

internalProgram.append(operand as NSNumber)
internalProgram.append(symbol as NSString)
还有这个

internalProgram.append(symbol)
变成这样

internalProgram.append(operand as NSNumber)
internalProgram.append(symbol as NSString)
您正在谈论的教程可能是用Swift 2编写的,您只需要
导入Foundation

var internalProgram=[AnyObject]()
func集合操作数(操作数:双精度){
//您已将操作数强制转换为任意对象!!
internalProgram.append(操作数作为任意对象)
}
集合操作数(操作数:10)
打印(internalProgram,类型(of:internalProgram))//[10]数组

正如您所说,
Double
String
不是Swift中的引用类型–它们是
struct
s。因此,您不能直接将它们存储在
[AnyObject]
中,您首先需要将它们连接到Objective-C

虽然在这种情况下不需要桥接到Objective-C–如果您想要一个异构类型的数组,包括值类型,那么您可以使用
[Any]

var internalProgram = [Any]()
但是,据我所知,您不需要任何数组()——您只需要一个可以包含
双精度
字符串
的数组

您可以使用
枚举来描述这一点:

enum OperationArgument { // feel free to give me a better name
    case operand(Double)
    case symbol(String)
}
现在您可以定义它的数组:

var internalProgram = [OperationArgument]()

func setOperand (operand: Double) {
    internalProgram.append(.operand(operand))
}

func performOperation (symbol: String) {
    internalProgram.append(.symbol(symbol))
}
现在,您可以使用
开关
if case
,而不是条件类型转换来获取每个元素的类型:

for element in internalProgram {
    switch element {
    case let .operand(operand):
        print(operand)
    case let .symbol(symbol):
        print(symbol)
    }

    if case let .operand(operand) = element {
        print(operand)
    }
}

铸造到任何对象都应该足够,导入基础不是必需的。