gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 05:31:49 25 4
gpt4 key购买 nike

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

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

不幸的是,这会产生一个错误:Use of undeclared type 'IntType' .

IntTypeif condition 的颜色甚至与源代码中的其他地方不同(如果将其粘贴到 Playground 上),这表明(如错误消息所述)它被视为类名(如 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

目前我有 ToolInfo结构,因为据我所知,它不可能在 <> 中传递类型在实例化通用类对象时。但我仍然无法比较它。

最佳答案

It means that is operator cannot be used with variables on the right side?

正确。 的右侧是必须在编译时硬编码。

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

关于类型存储在变量中的 Swift "is"运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31858191/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com