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)
}