加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

swift – 我可以指定generic是值类型吗?

发布时间:2020-12-14 05:36:11 所属栏目:百科 来源:网络整理
导读:我知道我们可以通过使用AnyObject来基本上指定我们的泛型是任何引用类型: class FooT: AnyObject { // ...} 但是有没有办法指定我们的泛型应该只是值类型,不允许引用类型? // some code for testing class C { } // just a simple class as an example for
我知道我们可以通过使用AnyObject来基本上指定我们的泛型是任何引用类型:
class Foo<T: AnyObject> {
    // ...
}

但是有没有办法指定我们的泛型应该只是值类型,不允许引用类型?

// 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通过扩展

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通过断言

另一个解决方案可以是通过断言

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

“解决方案”4通过where子句

这将是最好的解决方案,我想.不幸的是,这是不可能的

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

或类似.也许在将来的Swift版本中可能有可能.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读