Getter Setter 类型为任意 Swift
Getter Setter With Type of Any Swift
是否可以对类型为 '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
}
}
}
当我尝试在我的代码中使用它时,虽然我收到错误说明:
Cannot compare String to type Any
有没有一种方法可以在我需要时不将 'valueObject' 强制转换为字符串来使用类似的东西。一种使用它的方法,它已经知道它是 'String' 或 'BFSignature' 而不是 'Any'.
错误示例如下:
我宁愿它只知道 cellValue 是一个 'String.' 而不是每次使用它时都强制转换它。
如果这里需要使用固定数量的类型,可以使用枚举:
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
}
你不应该使用 Any
在我看来,您应该对 API 调用结果进行通用表示,而不是使用 Any
。您确切地知道 API 会变成 return,不是吗?它可以是 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)
}
是否可以对类型为 '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
}
}
}
当我尝试在我的代码中使用它时,虽然我收到错误说明:
Cannot compare String to type Any
有没有一种方法可以在我需要时不将 'valueObject' 强制转换为字符串来使用类似的东西。一种使用它的方法,它已经知道它是 'String' 或 'BFSignature' 而不是 'Any'.
错误示例如下:
如果这里需要使用固定数量的类型,可以使用枚举:
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
}
你不应该使用 Any
在我看来,您应该对 API 调用结果进行通用表示,而不是使用 Any
。您确切地知道 API 会变成 return,不是吗?它可以是 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)
}