Swift中是否可以区分Bool和Int?

Is it possible to distinguish Bool and Int in Swift?

我有一个 AnyObject 类型,可以是 StringIntBool 类型。我需要区分它们。

此代码试图这样做,但它认为 BoolInt:

import Cocoa

var value: AnyObject

func checkType(value: AnyObject) -> String {
    if let intvalue: Int = value as? Int {
        return("It is an integer")
    } else if let boolvalue: Bool = value as? Bool {
        return("It is an boolean")
    } else if let stringvalue: String = value as? String {
        return("It is an string")
    }
    return "not found"
}

value = "hello"
checkType(value) // It is an string

value = 1
checkType(value) // It is an integer

value = true
checkType(value) // It is an integer
func checkType<T>(value: T) -> String {
    var statusText = "not found"
    if value is Int {
        statusText = "It is an integer"
    } else if value is Bool {
        statusText = "It is an boolean"
    } else if value is String {
        statusText = "It is an string"
    }
    return statusText
}

AnyObject 不能隐式向下转换为 Swift 中的任何类型。对于这种情况,您可以使用 Generics 代替。

Generic code enables you to write flexible, reusable functions and types that can work with any type, subject to requirements that you define. Read more.

我的工作方式是使用 Mirror 结构。

let value: Any? = 867
let stringMirror = Mirror(reflecting: value!)
let type = stringMirror.subjectType
print(stringMirror.subjectType)

if type == Bool.self {
    print("type is Bool")
} else if type == String.self {
    print("type is string")
} else if type == Int.self {
    print("type is Int")
}

在这里使用 Any 因为 Int、String、Bool 是结构。 如果您只是尝试使用 来区分 类,那么 应该可行。

if value is NSString {
    print("type is NSString")
}

为了区分 Bool 和 Int(在纯 Swift 和 ObjC 桥接中),可以对 AnyHashable

使用以下扩展
extension AnyHashable {

    var isBool: Bool {
        Bool(description) != nil && !(self is String)
    }

    var boolValue: Bool? {
        isBool ? (self as? Bool) : nil
    }
}

这里我们检查 Bool-like 值的 true/false 描述,然后排除相同的 String-like 值。

获取数据集合(例如json)并将其转换为AnyHashable是很常见的情况。

同样适用于 NSNumber