Swift 泛型和协议扩展
Swift Generics and Protocol Extensions
我有一个协议 Reusable
,它有一个静态函数 static func reuseId() -> String
和一个定义函数默认实现的协议扩展。然后,我在 UITableViewCell
上实现了一个扩展以符合 Reusable
协议。我现在可以毫无问题地在我的 TableViewCells 上使用该函数:SomeTableViewCell.reuseId()
.
我遇到的问题是泛型。我有一个泛型 class,它有一个 UITableViewCell
:
类型的泛型参数
internal class SomeClass<CellType: UITableViewCell>: NSObject {
...
}
我希望能够在 CellType
上的通用 class 中使用 Reusable
中指定的函数,但不幸的是,这无法按预期工作。编译器总是生成错误 Type 'CellType' has no member 'reuseId'
。
有人知道为什么会这样吗?有解决方法吗?
我正在使用 Xcode 7.0 和 Swift 2.0。
来自德国的问候
更新:下面是一些示例代码,可以更好地说明我的问题:
import UIKit
protocol Reusable {
static func reuseId() -> String
}
extension Reusable {
static func reuseId() -> String {
return String(self).componentsSeparatedByString(".").last!
}
}
extension UITableViewCell: Reusable { }
class SomeGenericClass<CellType: UITableViewCell> {
func someFunction() {
let reuseIdentifier = CellType.reuseId()
}
}
此代码会产生上述错误,但我不太明白为什么会这样。我认为与 jtbandes 发布的示例代码的主要区别在于我使用了静态函数。
更新:此问题已在 Xcode 8.3 beta 2 中修复。上面的示例代码现在可以按预期工作(当然是在将其迁移到 Swift 3 之后)。
这是一个有趣的问题。您的代码似乎应该可以工作;你可能想要 file an enhancement request.
这是一个似乎可以正常工作的解决方法:
class SomeGenericClass<CellType: Cell> {
func someFunction() {
let reuseIdentifier = (CellType.self as Reusable.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"
我有一个协议 Reusable
,它有一个静态函数 static func reuseId() -> String
和一个定义函数默认实现的协议扩展。然后,我在 UITableViewCell
上实现了一个扩展以符合 Reusable
协议。我现在可以毫无问题地在我的 TableViewCells 上使用该函数:SomeTableViewCell.reuseId()
.
我遇到的问题是泛型。我有一个泛型 class,它有一个 UITableViewCell
:
internal class SomeClass<CellType: UITableViewCell>: NSObject {
...
}
我希望能够在 CellType
上的通用 class 中使用 Reusable
中指定的函数,但不幸的是,这无法按预期工作。编译器总是生成错误 Type 'CellType' has no member 'reuseId'
。
有人知道为什么会这样吗?有解决方法吗?
我正在使用 Xcode 7.0 和 Swift 2.0。
来自德国的问候
更新:下面是一些示例代码,可以更好地说明我的问题:
import UIKit
protocol Reusable {
static func reuseId() -> String
}
extension Reusable {
static func reuseId() -> String {
return String(self).componentsSeparatedByString(".").last!
}
}
extension UITableViewCell: Reusable { }
class SomeGenericClass<CellType: UITableViewCell> {
func someFunction() {
let reuseIdentifier = CellType.reuseId()
}
}
此代码会产生上述错误,但我不太明白为什么会这样。我认为与 jtbandes 发布的示例代码的主要区别在于我使用了静态函数。
更新:此问题已在 Xcode 8.3 beta 2 中修复。上面的示例代码现在可以按预期工作(当然是在将其迁移到 Swift 3 之后)。
这是一个有趣的问题。您的代码似乎应该可以工作;你可能想要 file an enhancement request.
这是一个似乎可以正常工作的解决方法:
class SomeGenericClass<CellType: Cell> {
func someFunction() {
let reuseIdentifier = (CellType.self as Reusable.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"