Swift 错误:参数类型double/string等不符合预期类型";“任何对象”;
我看了一些iOS编程教程,对“AnyObject”有一个问题。 桥接不起作用。 我有以下代码: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
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)
}
}
铸造到任何对象都应该足够,导入基础不是必需的。