Swift泛型,创建派生对象
Swift Generics, create derived object
我有一个编码为通用的商店 class,因此它可以管理从公共基础 class.[=12 派生的所有类型的 classes =]
商店有一个 new() 方法,该方法创建并 returns 当前管理的 class。理论上应该return导出class.
不幸的是,商店 return 始终是基地 class。这是解释它的代码片段:
import UIKit
class Base: NSObject {
var ID:Int=0
}
class Adress:Base
{
var name = ""
}
class Store<T:Base> {
var nextID:Int = 0
func getNextID()->Int {
return ++nextID;
}
func new() ->T{
let n = T()
n.ID = getNextID()
return n
}
}
let store = Store<Adress>()
var adr:Adress = store.new() // should be Adress, but is Base
adr.name = "Tom" // crash here, because adr is not an Adress
如果我在 Store 中调试 new() 方法,它会创建一个 Adress 对象。但是在调用代码中,突然变成了一个Base对象。
知道这里出了什么问题吗?
我不完全理解你上面代码的意图。但是如果你替换
class Store<T: Base> {
来自
class Store<T: Adress> {
则变量adr的类型为Adress。然后以下语句有效
println(adr.name) // displays "Tom"
println(adr.ID) // displays "1"
我有一个编码为通用的商店 class,因此它可以管理从公共基础 class.[=12 派生的所有类型的 classes =]
商店有一个 new() 方法,该方法创建并 returns 当前管理的 class。理论上应该return导出class.
不幸的是,商店 return 始终是基地 class。这是解释它的代码片段:
import UIKit
class Base: NSObject {
var ID:Int=0
}
class Adress:Base
{
var name = ""
}
class Store<T:Base> {
var nextID:Int = 0
func getNextID()->Int {
return ++nextID;
}
func new() ->T{
let n = T()
n.ID = getNextID()
return n
}
}
let store = Store<Adress>()
var adr:Adress = store.new() // should be Adress, but is Base
adr.name = "Tom" // crash here, because adr is not an Adress
如果我在 Store 中调试 new() 方法,它会创建一个 Adress 对象。但是在调用代码中,突然变成了一个Base对象。
知道这里出了什么问题吗?
我不完全理解你上面代码的意图。但是如果你替换
class Store<T: Base> {
来自
class Store<T: Adress> {
则变量adr的类型为Adress。然后以下语句有效
println(adr.name) // displays "Tom"
println(adr.ID) // displays "1"