Getter Setter与任何Swift类型

时间:2018-03-08 13:51:56

标签: swift swift3

是否可以为类型为“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'。

以下是错误示例: enter image description here 我宁愿知道cellValue是一个'字符串'。而不是每次我使用它时都会抛出它。

2 个答案:

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