作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
This guy说 Swift 泛型方法可以重载作为一种特殊化它们的方式:
func testMethod<T: Comparable>(v: T) -> T {
return v
}
func testMethod(v: Int) -> Int {
return v * 12345
}
所以我试图得到一些类似的东西。我做了一个类来从字节缓冲区读取整数。它特别定义了这些方法:
public func read(type: Int32.Type) -> Int32 {
return /* implementation detail */
}
public func read<T: IntegerType>(type: T.Type) -> T {
let bug: T! = nil
return bug
}
public func readInto<T: IntegerType>(inout into: T) {
into = read(T.self)
}
还有很多read(type: [U]Int[bits])
重载 read<T>
的方法方法。如果我尝试从非泛型实现未涵盖的类型中读取数据,则泛型方法可以作为万能的方法使我的程序崩溃。
readInto
method 是一种方便的方法,因此我不必重复对象的类型。如果我想读入 Int32
变量,而不是做 variable = reader.read(type: Int32.self)
,我能做到reader.read(&variable)
,因为我不想重复自己,所以我觉得这样更好。
我的问题是来自 readInto
的电话系统地去包罗万象read<T>
,即使存在更精确的过载。
有没有办法让它从泛型方法中调用最精确的重载?
最佳答案
这并没有解决一般问题,但是 Swift 函数可以从它们的返回类型重载。例如:
func foo() -> Int16 {
return 0
}
func foo() -> Int32 {
return 1
}
let i16: Int16 = foo() // 0
let i32: Int32 = foo() // 1
let i = foo() // compile-time error: ambiguous
这实际上意味着我不需要 readInto
方法读入给定类型的变量,我可以将 read()
的结果分配给它调用并完成它,该死的泛型。
关于generics - 如何从泛型函数中调用最精确的重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27880469/
我是一名优秀的程序员,十分优秀!