Swift中是否可以区分Bool和Int?
Is it possible to distinguish Bool and Int in Swift?
我有一个 AnyObject
类型,可以是 String
、Int
或 Bool
类型。我需要区分它们。
此代码试图这样做,但它认为 Bool
是 Int
:
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
。
我有一个 AnyObject
类型,可以是 String
、Int
或 Bool
类型。我需要区分它们。
此代码试图这样做,但它认为 Bool
是 Int
:
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
。