错误:参数类型double / string等不符合预期类型" AnyObject"

时间:2016-11-05 13:30:39

标签: swift

我观看了一些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不是引用类型。 但无论如何,在教程中,桥接工作正常...... 可能是我失败的原因是什么?

3 个答案:

答案 0 :(得分:3)

正如您所说,DoubleString不是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))
}

现在,您可以使用switchif 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>