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"