Swift";是";类型存储在变量中的运算符

Swift";是";类型存储在变量中的运算符,swift,types,Swift,Types,这段代码按预期工作。“整数为int”在输出中打印 let integer = Int() if integer is Int { println("integer is int") } else { println("integer is not int") } 我想使用is操作符,就像我可以使用isKindOfClass方法一样-类(或者更确切地说是类型)存储在变量中。它看起来是这样的: let integer = Int() let intType : Any = Int

这段代码按预期工作。“整数为int”在输出中打印

let integer = Int()

if integer is Int {
    println("integer is int")
}
else {
    println("integer is not int")
}
我想使用
is
操作符,就像我可以使用
isKindOfClass
方法一样-类(或者更确切地说是类型)存储在变量中。它看起来是这样的:

let integer = Int()
let intType : Any = Int.self

if integer is intType {
    println("Integer is int")
}
else {
    println("Integer is not int")
}
不幸的是,这会产生一个错误:
使用未声明的类型“IntType”

if
条件中的
IntType
的颜色(如果您将其粘贴到游乐场)甚至与源代码中其他地方的颜色不同,这表明(正如错误消息所说)它被视为类名(如
IntType
将是一个类)。但事实并非如此。这意味着
is
运算符不能与右侧的变量一起使用

我想使用
is
运算符,因为它不仅可以比较类,还可以比较其他类型

如何检查值是否具有我期望的类型


我找到了肮脏的解决方案,但它真的很不可靠

let integer = Int()
let intType : Any = Int.self

func ==(left: Any, right: Any) -> Bool {
    let leftString = "\(left)"
    let rightString = "\(right)"
    return leftString == rightString
}

if (integer.dynamicType as Any) == intType {
    println("true")
}
else {
    println("false")
}
工作完美,但要小心-因为这一点也是正确的:

if (integer.dynamicType as Any) == ("Swift.Int" as Any) {
    println("true")
}
else {
    println("false")
}
有更好的办法吗


好的,我将进一步解释我想要实现的目标。我有一个管理泛型类实例实例的对象。在某些时候,我需要根据泛型的类型选择一个泛型类实例。例如:

class GenericClass<T> {}

struct ToolInfo {
    let tool : AnyObject
    let jobType : Any
}

class Manager {
    var tools = Array<ToolInfo>()

    func pickToolForTheJob(job : Any) -> AnyObject {
        return tools.magicMethodWhichReturnProperTool()
    }
}

let viewTool = GenericClass<UIView>()
let rectangleTool = GenericClass<CGRect>()

let manager = Manager()
manager.tools.append(ToolInfo(tool: viewTool, jobType: UIView.self))
manager.tools.append(ToolInfo(tool: rectangleTool, jobType: CGRect.self))

manager.pickToolForTheJob(UIView()) // i want to get viewTool here
manager.pickToolForTheJob(CGRect()) // i want to get rectangleTool here
class GenericClass{}
结构工具信息{
让工具:AnyObject
让作业类型:任何
}
班级经理{
var工具=数组()
作业的func picktool(作业:Any)->AnyObject{
return tools.magicMethodWhichReturnProperTool()
}
}
让viewTool=GenericClass()
设rectangleTool=GenericClass()
让manager=manager()
manager.tools.append(工具信息(工具:viewTool,作业类型:UIView.self))
manager.tools.append(工具信息(工具:矩形工具,作业类型:CGRect.self))
manager.pickToolForTheJob(UIView())//我想在这里获取viewTool
manager.pickToolForTheJob(CGRect())//我想在这里获取矩形工具

目前我有
toolnfo
struct,因为据我所知,在实例化泛型类对象时,不可能将类型传入
。但是我仍然无法比较它。

这是我对
enum
类型容器的实验(抱歉,在前面的评论中错误地编写了
struct
):

您可以在项目中执行类似的操作

这意味着is运算符不能与右侧的变量一起使用

对。
的右侧是
,必须在编译时硬编码


如果您不需要多态性,并且您的类型是类类型,那么可以使用
==
将实例的
dynamicType
与类类型进行比较。这是在纯Swift中在某个对象的右侧获取类型变量的唯一方法。

也考虑过实现===运算符,但它并不能很好地解决它。另一个想法是像optionals那样将其包装在
结构中,但不知道是否适合您。不确定为什么需要将类存储到变量中,但我认为typealias是为这些东西设计的。我已经更新了问题以显示我的问题,也许你们中的一些人会建议其他方法来解决此问题@它看起来怎么样?请您进一步解释一下(使用结构)或显示一些伪代码示例好吗?@zellb使用typealias会是什么样子?
typealias intType=Int
您说过“您的类型是类类型”。这意味着不可能检查非类类型的比较类型?如果您可以使用此信息更新您的答案,使其清晰可见,我将接受此答案作为结束此问题的答案。“这意味着无法检查非类类型的比较类型?”您可以将其与
is
进行比较。但如果右边的是某种类型的a型变量,则不会。正如我在回答中所说,
的右侧是
,必须硬编码。这是因为斯威夫特对打字很严格;它需要在编译时知道所有内容的类型。我不知道“this”是什么。
enum TypeContainer {
    case SomeInt(Int)
    case SomeString(String)
    case SomeBool(Bool)

    init(int: Int) {
        self = .SomeInt(int)
    }

    init(string: String) {
        self = .SomeString(string)
    }

    init(bool: Bool) {
        self = .SomeBool(bool)
    }
}

let a = TypeContainer(string: "123")
let b = TypeContainer(int: 88)
let c = TypeContainer(bool: true)

switch a {
case .SomeInt(let i):
    println(i)
case .SomeString(let s):
    println(s)
case .SomeBool(let b):
    println(b)
default:
    break
}