我观看了一些iOS编程教程并对#34; 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
和引用类型与struct的关系,而double和string不是引用类型。
但无论如何,在教程中,桥接工作正常......
可能是我失败的原因是什么?
答案 0 :(得分:3)
正如您所说,Double
和String
不是Swift中的引用类型 - 它们是struct
s。因此,您无法直接将它们存储在[AnyObject]
中,您首先需要将它们桥接到Objective-C才能这样做。
虽然在这种情况下不需要桥接到Objective-C - 如果你想要一组异构类型,包括值类型,那么你可以使用[Any]
:
var internalProgram = [Any]()
然而,据我所知,你不想要一个任何东西(it's very rarely a good idea)的数组 - 你只需要一个可以包含的数组Double
或 a String
。
您可以使用enum
:
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))
}
现在,您可以使用switch
或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)
}
}
答案 1 :(得分:0)
要将Swift 值类型用作""
,在Swift 3中,您需要将其显式地转换为旧的Objective-C对象类型。
所以这个
df1 <- data.frame(Id = rep(c("SCSR1", "SCCS9", "SKHH1"), each = 7),
Month = rep(c('Jan-16', 'Feb-16', 'Mar-16', 'Apr-16', 'May-16', 'Jun-16',
'Jul-16'), 3), Value = c(400, rep(0, 6), 440, 3000, 400, 100, 300, 400,
100, 1000, rep(0,6)))
变成这个
AnyObject
这个
internalProgram.append(operand)
变成这个
internalProgram.append(operand as NSNumber)
您正在谈论的教程可能是使用Swift 2编写的,您需要
internalProgram.append(symbol)
。
答案 2 :(得分:0)
var internalProgram = [AnyObject]()
func setOperand (operand: Double) {
// you have cast operand as AnyObject !!
internalProgram.append(operand as AnyObject)
}
setOperand(operand: 10)
print(internalProgram, type(of: internalProgram)) // [10] Array<AnyObject>