我看了一些 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
以及引用类型与结构体,并且 double 和 string 不是引用类型。
但无论如何,在教程中桥接工作得很好......
我失败的原因可能是什么?
正如你所说,Double
and String
不是 Swift 中的引用类型——它们是struct
s。因此你不能直接将它们存储在[AnyObject]
,您首先需要将它们桥接到 Objective-C 才能做到这一点。
虽然在这种情况下桥接到 Objective-C 是不必要的——如果你想要一个异构类型的数组,包括值类型,那么你可以使用[Any]
:
var internalProgram = [Any]()
然而,据我所知,你don't想要一个数组anything (这很少是个好主意) – 你只想要一个可以包含Double
or 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
or an 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)
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)