Swift泛型和协议扩展

Swift泛型和协议扩展,swift,generics,protocols,swift2,xcode7,Swift,Generics,Protocols,Swift2,Xcode7,我有一个协议reusible,它有一个静态函数static func reuseId()->String,还有一个协议扩展,定义了该函数的默认实现。然后,我在UITableViewCell上实现了一个扩展,以符合可重用协议。我现在可以在我的TableViewCells上使用该函数,没有问题:SomeTableViewCell.reuseId() 我的问题是泛型。我有一个泛型类,其泛型参数的类型为UITableViewCell: internal class SomeClass<CellTy

我有一个协议
reusible
,它有一个静态函数
static func reuseId()->String
,还有一个协议扩展,定义了该函数的默认实现。然后,我在
UITableViewCell
上实现了一个扩展,以符合
可重用
协议。我现在可以在我的TableViewCells上使用该函数,没有问题:
SomeTableViewCell.reuseId()

我的问题是泛型。我有一个泛型类,其泛型参数的类型为
UITableViewCell

internal class SomeClass<CellType: UITableViewCell>: NSObject { 
    ...
}
这段代码将生成上述错误,但我不太明白为什么会发生这种情况。我认为与jtbandes发布的示例代码的主要区别在于我使用了一个静态函数



更新:这个问题在Xcode 8.3 beta 2中得到了修复。上面的示例代码现在按预期工作(当然是在迁移到Swift 3之后)。

这是一个有趣的问题。您的代码似乎应该可以工作;你可能想

这里有一个似乎可以正常工作的变通方法:

class SomeGenericClass<CellType: Cell> {
    func someFunction() {
        let reuseIdentifier = (CellType.self as Reusable.Type).reuseId()
    }
}
class SomeGenericClass{
func someFunction(){
让reuseIdentifier=(CellType.self作为reusables.Type.reuseId()使用)
}
}
另一种获得所需的解决方法:

class GenericExample<CellType:UITableViewCell where CellType:Reusable>     
{
    func test() -> String {
        return CellType.reuseId()
    }
}

GenericExample<UITableViewCell>().test() // returns "UITableViewCell"
GenericExample<MyCell>().test() // returns "MyCell"
class GenericExample
{
func test()->字符串{
返回CellType.reuseId()
}
}
GenericeExample().test()//返回“UITableViewCell”
GenericExample().test()//返回“MyCell”

如果您发布一个(最小的)实际代码示例,而不是只描述问题,那将更有帮助。我在原始问题中添加了示例代码,希望能让我的问题更容易理解。但是CellType继承了UITableViewCell,它已经符合可重用的规则。在我看来,需要更多的信息,我无法用一个简单的例子来重现这个问题。谢谢@MartinR,我想我误解了这个问题。是的,需要更多信息…谢谢。我贴了一个雷达22776964。你的变通方法在目前看来效果不错,因此我将把你的答案标记为正确。我会在苹果回复radar后更新这个问题。最初的场景很可能是一个bug,因为XCode中的自动补全模型知道CellType有一个resuseID(),但编译器却抱怨没有
class GenericExample<CellType:UITableViewCell where CellType:Reusable>     
{
    func test() -> String {
        return CellType.reuseId()
    }
}

GenericExample<UITableViewCell>().test() // returns "UITableViewCell"
GenericExample<MyCell>().test() // returns "MyCell"