У меня есть протокол Reusable, который имеет статическую функцию static func reuseId() -> String и расширение протокола, определяющее реализацию функции по умолчанию. Затем я реализовал расширение для UITableViewCell, чтобы оно соответствовало протоколу Reusable. Теперь я могу без проблем использовать эту функцию в своих TableViewCells: SomeTableViewCell.reuseId().
У меня проблема с дженериками. У меня есть универсальный класс с общим параметром типа UITableViewCell:
internal class SomeClass<CellType: UITableViewCell>: NSObject {
...
}
Я хочу иметь возможность использовать функцию, указанную в Reusable, в моем универсальном классе на CellType, но, к сожалению, это не работает должным образом. Компилятор всегда выдает ошибку 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).