【发布时间】:2014-08-22 06:24:01
【问题描述】:
我正在尝试使用一些通用方法创建一个 DataContext 类来处理各种数据实体。我想要的功能之一是能够使用导航属性更新相关实体。这是我到目前为止的一个例子:
上下文类:
class DataContext
{
private var contextItems: [ContextItem] = []
...
func UpdateNavigationProperty<T: ContextEntity>(inout oldValue: T?, inout navigationId: Int?, newValue: T?)
{
if let newValue = newValue {
if dataContext.GetContextItem(newValue) == nil {
dataContext.Add(newValue)
if newValue.id > 0 {
if let item = dataContext.GetContextItem(newValue) {
item.state = .None
}
if navigationId != newValue.id {
navigationId = newValue.id
}
}
}
}
oldValue = newValue
}
}
协议定义:
protocol ContextEntity : NSObjectProtocol
{
var id: Int { get set }
func Save()
func Delete()
}
Vehicle 类是class Car: Vehicle, ContextEntity 等的便利基类:
class Vehicle : NSObject
{
var id: Int
var driverId: Int
private var _driver: Person?
var driver: Person? {
get {
if(_driver == nil && driverId != 0) {
_driver = dataContext.Get(driverId)
}
return _driver
}
set {
dataContext.UpdateNavigationProperty(&_driver, navigationId: &driverId as Int?, newValue: newValue)
}
}
}
相关类:
class Person: NSObject, ContextEntity
{
var id: Int
//MARK: ContextEntity Implementation
func Save() { }
func Delete() { }
}
dataContext.UpdateNavigationProperty(&_driver, navigationId: &driverId as Int?, newValue: newValue) 行抛出错误:
类型“$T10”不符合协议“ContextEntity”
由于某种我无法发现的原因,泛型方法不理解传递给泛型方法的对象实际上符合ContextEntity(请参阅Person 类定义)
我是否完全误解了 Swift 泛型?还是这是某种错误?
编辑
Person 类的导航属性(示例中未描述)没有此错误。所以我假设编译器(错误地?)使用调用类的类型作为有问题的泛型方法的类型。
【问题讨论】: