【问题标题】:Swift Generics Error "Type '$T10' does not conform to protocol 'MyProtocol'" (beta 5)Swift 泛型错误“类型 '$T10' 不符合协议 'MyProtocol'”(测试版 5)
【发布时间】: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(&amp;_driver, navigationId: &amp;driverId as Int?, newValue: newValue) 行抛出错误:

类型“$T10”不符合协议“ContextEntity”

由于某种我无法发现的原因,泛型方法不理解传递给泛型方法的对象实际上符合ContextEntity(请参阅Person 类定义)

我是否完全误解了 Swift 泛型?还是这是某种错误?

编辑

Person 类的导航属性(示例中未描述)没有此错误。所以我假设编译器(错误地?)使用调用类的类型作为有问题的泛型方法的类型。

【问题讨论】:

    标签: generics swift protocols


    【解决方案1】:

    我想通了。

    这既不是泛型错误,也不是协议错误,而是编译器没有告诉我实际的错误是什么。

    错误在于我试图将输入输出参数navigationId 从Int 转换为Int?,它似乎并不喜欢。如果我尝试直接传递Int 也不喜欢

    对 setter 的正确调用是使用中间变量:

    var navId: Int? = driverId
    dataContext.UpdateNavigationProperty(&_driver, navigationId: &navId, newValue: newValue)
    if navId != nil {
        driverId = navId!
    }
    

    【讨论】:

      猜你喜欢
      • 2014-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多