如何声明具有类型约束的数组?

PeiSong

我想要这样声明:

var types:Array<T.Type where T:Cacheable> = []

存储T.self。但是语法是错误的。正确的方法是什么?谢谢。

为了更加清楚,这是我想要做的简短描述:

protocol Cacheable {
    class func cacheKey() -> String
}

class User:Cacheable {
    class func cacheKey() -> String {
        return "user"
    }
}

class Post:Cacheable {
    class func cacheKey() -> String {
        return "post"
    }
}

func initTables(type: Cacheable.Type) {
    println(type.cacheKey()) // errors if use @Matt solution
}

func startup() {
    for type:Cacheable.Type in [User.self, Post.self] {
        initTables(type)
    }
}
马特

我尝试了这个,它似乎起作用:

protocol Cacheable {}
struct S1 : Cacheable {}
struct S2 : Cacheable {}

var types : Array<Cacheable.Type> = []

// and this shows that we can actually store types in the array
types.append(S1)
types.append(S2)

而且,如果您尝试说错types.append(String)什么,例如编译器阻止了您,并抱怨String不符合Cacheable,这正是我们希望它说的...!


编辑好的,所以您已经移动了问题的门柱。这是一个有趣的新问题,但这是一个完全不同的问题。这里的问题是协议是“存在的元类型”,而不是“元类型”。您不能通过协议多态地访问类函数。您必须改用超类。这有效:

class Super {
    class func cacheKey() -> String {
        return "super"
    }
}

class User:Super {
    override class func cacheKey() -> String {
        return "user"
    }
}

class Post:Super {
    override class func cacheKey() -> String {
        return "post"
    }
}

func test() {
    for type : Super.Type in [User.self, Post.self] {
        println(type.cacheKey())
    }
}

因此,如果您没有Post和User的其他超类,请给他们一个任意的超类Super。如果确实有Post和User的超类,则cacheKey()在扩展名中为该类提供类func 无论哪种方式,您现在都拥有一个多态类func cacheKey


但是,您真正的问题似乎是第三件事,即如何获得类的唯一标识符。可能有比使用此类的类函数更好的方法!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在 Haskell 中声明具有类型约束的新类型?

如何声明可以具有int和float的数组类型

具有类型约束的Swift通用数组

如何指定具有约束的类型?

如何声明 TS 类型,该类型是具有类型为数字或字符串值的属性的对象数组?

TypeScript:如何为具有不同元素类型但没有固定长度的JavaScript数组声明类型?

如何定义具有约束的数据类型?

约束类型以具有特定类型的属性

如何声明具有带类型参数的特征的函数的实现?

如何声明具有多个界限的类类型的对象

如何声明具有类型并实现协议的变量?

如何声明符合具有特定关联类型的协议的变量?

如何在Typescript中声明具有特殊类型的变量

如何声明具有特定前缀的字符串类型

在Chapel中将数组类型约束为具有连续数据的本地数组的最佳方法是什么?

如何使用不带约束的类型参数调用具有泛型约束的方法?

如何在 JavaScript 中声明具有对象数组的对象?

结构声明错误(错误:数组类型具有不完整的元素类型“结构条目”)

如何快速声明数组类型

具有约束的Scala通用类型

对类型具有算术约束的Typeclass实例

具有扩展类型约束的Swift字典

协议的声明属性显示协议只能用作一般约束,因为它具有“自身”或关联的类型要求

如何声明具有多个具有非平凡关系的泛型类型的成员?

具有长度约束的最大子数组

形成具有特殊约束的数组子集

如何在IntelliJ IDEA中从具有推断类型的变量导航到Kotlin类型声明?

如何在Python中为具有不同类型的字典添加类型声明作为值

声明具有通用类型的组件