Быстрые генераторы и расширения протокола

У меня есть протокол Reusable, который имеет статическую функцию static func reuseId() -> String и расширение протокола, которое определяет реализацию по умолчанию для этой функции. Затем я реализовал расширение на UITableViewCell для соответствия протоколу Reusable. Теперь я могу использовать функцию на моем TableViewCells без проблем: SomeTableViewCell.reuseId().

У меня есть проблема с Generics. У меня есть общий класс, который имеет общий параметр типа UITableViewCell:

internal class SomeClass<celltype: uitableviewcell="">: NSObject { 
 ...
}
</celltype:>

Я хочу использовать функцию, указанную в Reusable в моем родовом классе на CellType, но, к сожалению, это не работает должным образом. Компилятор всегда генерирует ошибку Type 'CellType' has no member 'reuseId'.

Кто-нибудь знает, почему это происходит? Есть ли способ обхода?

Я использую Xcode 7.0 с Swift 2.0.

Приветствия из Германии

UPDATE: Вот пример кода, который лучше показывает мою проблему:

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()
 }
}
</celltype:>

Этот код генерирует вышеуказанную ошибку, но я не совсем понимаю, почему это происходит. Я думаю, что основное отличие от кода примера, в котором размещено jtbandes, - это использование статической функции.

ОБНОВЛЕНИЕ: проблема исправлена ​​в Xcode 8.3 beta 2. Пример кода выше теперь работает так, как ожидалось (после его переноса в Swift 3, конечно).

2 ответа

Это интересная проблема. Ваш код кажется, что он должен работать; вы можете захотеть создать файл с расширением.

Вот обходной путь, который работает корректно:

class SomeGenericClass<celltype: cell=""> {
 func someFunction() {
 let reuseIdentifier = (CellType.self as Reusable.Type).reuseId()
 }
}
</celltype:>


Другой способ (обходной путь), чтобы получить то, что вам нужно:

class GenericExample<celltype:uitableviewcell where="" celltype:reusable=""> 
{
 func test() -> String {
 return CellType.reuseId()
 }
}
GenericExample<uitableviewcell>().test() // returns "UITableViewCell"
GenericExample<mycell>().test() // returns "MyCell"
</mycell></uitableviewcell></celltype:uitableviewcell>

licensed under cc by-sa 3.0 with attribution.