Swift变量约束

时间:2015-11-19 14:52:11

标签: ios swift generics types

在Swift(2.1)的当前迭代中是否可以在变量类型上添加约束?

如果我有课程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

或者我必须覆盖didSet

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

我确信这是不可能的,通用系统没有我想要的那么强大(例如,只能通过协议和类继承来约束扩展,并且没有可变参数)。

1 个答案:

答案 0 :(得分:2)

类型约束和类型检查是一种编译功能,但您要检查对象的运行时值。

我很确定这是不可能的。您必须使用运行时检查(例如willSetdidSet)。

或者,不是按type属性的值强制执行类型,而是使用实际类型强制执行,例如

子类

class Header: Element

或使Element由四个单独的类实现的协议:

protocol Element {
}

class Header: Element

(您可以对共享功能使用协议扩展)。