是否可以为类型为“Any”的属性执行getter和setter
以下是我的想法:
private var _valueObject: Any?
public var valueObject: Any? {
set {
if newValue is String {
self._valueObject = newValue as? String
} else if newValue is BFSignature {
self._valueObject = newValue as? BFSignature
}
}
get {
if self._valueObject is String {
return self._valueObject as? String
} else if self._valueObject is BFSignature {
return self._valueObject as? BFSignature
} else {
return self._valueObject
}
}
}
当我尝试在我的代码中使用它时虽然我收到错误说明:
无法比较字符串以键入任何
有没有办法在我需要的时候使用像这样的东西而不将'valueObject'强制转换为字符串。一种使用它的方法,它已经知道它的'String'或'BFSignature'而不是'Any'。
答案 0 :(得分:3)
如果您需要在此处使用固定数量的类型,则可以使用枚举:
struct BFSignature {
var a: Int
}
enum Either {
case bfSig(BFSignature)
case string(String)
}
var a: Either
var b: Either
a = .bfSig(BFSignature(a: 7))
b = .string("Stack Overflow")
a = b
<强>用法:强>
switch (b) {
case Either.bfSig(let signature):
print(signature.a) // Output integeral value
case Either.string(let str):
print(str) //Output string value
}
答案 1 :(得分:3)
您不应该使用Any
在我看来,您应该对API调用结果进行通用表示,而不是使用Any
。您确切知道API会返回什么,不是吗?它可以是String
或您转换为自定义对象BFSignature
的内容。
因此,您可以使用枚举来表示API调用结果:
enum APIResult {
case signature(BFASignature)
case justString(String)
}
并像
一样使用它private var _valueObject: APIResult?
if let stringValue = newValue as? String {
self._valueObject = .justString(stringValue)
}
if let signatureValue = newValue as? BFSignature {
self._valueObject = .signature(signatureValue)
}