2015-11-19 2 views
1

Возможно ли в текущей итерации Swift (2.1) добавить ограничения на тип переменной?Swift Variable Constraints

Если у меня есть класс Element

class Element: NSObject { 
    var type: ElementType 
    init(type: ElementType) { 
     self.type = type 
    } 
} 

с перечислением ElementType

enum ElementType { 
    case Cell 
    case Header 
    case Footer 
    case Decoration(kind: String) 
} 

в каком-то другом классе, если у меня есть переменный типа Element, это вообще можно ставить ограничения, такие как :

var element: Element? where Self == .Header 

или вместо этого w ульд я должен переопределить didSet

var element: Element? { 
    didSet { 
     if let value = element where value.type == Decoration { 
      element = Optional.None 
     } 
    } 
} 

я уверен, что это не возможно, то общая система не является столь мощным, как хотелось бы (будучи в состоянии только ограничить расширения от наследования протокола и класса, например, и не VARIADIC общие параметры).

ответ

2

Проверка ограничений типов и типов - это функция компиляции, но вы хотите проверить время выполнения объекта.

Я уверен, что это невозможно. Вам нужно будет использовать проверку времени выполнения (например, willSet или didSet).

Или вместо того, чтобы применять тип к значению атрибута type, применяйте его к реальному типу, например.

подклассов

class Header: Element 

или сделать Element это протокол реализуется четыре отдельных классов:

protocol Element { 
} 

class Header: Element 

(вы можете использовать расширение протокола для общих функций).

+0

Это очень плохо, мне бы хотелось увидеть какую-то функцию фильтра ограничений с расширениями, где вы можете выборочно применять расширения на основе значений перечисления, например – barndog

+0

Я изначально создал эту библиотеку, которую я создаю в объективе-c, поэтому у меня было структуру подкласса, где «Заголовок» унаследован от общего класса «Элемент», но я тоже вроде ассоциированных перечислений. кто знает, мы увидим – barndog