我可以指定泛型是值类型吗?

2024-05-21

我知道我们基本上可以通过使用指定我们的泛型是任何引用类型AnyObject:

class Foo<T: AnyObject> {
    // ...
}

但是有没有办法指定我们的泛型只能是value类型,并且不允许引用类型?


// some code for testing    
class C { } // just a simple class as an example for a reference type
var c = C()
var d: Double = 0.9 // a value type

解决方案1通过extension

protocol ValueType { }
extension Double : ValueType { }
extension Int : ValueType { }
// ... all value types to be added

func printT1 <T: ValueType> (input: T) {
    println("\(input) is value")
}
printT1(d) // Does work
//printT1(c) // Does not work

但正如评论中提到的,它有效但不可行,因为用户定义的值类型必须实现此协议。


解决方案2通过方法签名

func printT <T: AnyObject> (input: T) {
    println("\(input) is reference")
}

func printT <T: Any> (input: T) {
    println("\(input) is value")
}

解决方案3通过assert

另一种解决方案可以是通过assert

func printT <T: Any> (input: T) {
    print("\(input) is " + ((T.self is AnyObject) ? "reference" : "value"))
}

“解决方案”4通过where clauses

我认为这将是最好的解决方案。不幸的是,不可能有

func printT <T: Any where T: ~AnyObject > (input: T) {
    println("\(input) is value")
}

或类似的。也许在 Swift 的未来版本中这将成为可能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以指定泛型是值类型吗? 的相关文章

随机推荐