如何在Swift中实现可选值?

时间:2014-07-03 08:18:42

标签: swift optional

我想知道如何实现Swift(Int,Float ...)中的值类型以支持可选绑定("?")。 我假设这些值类型没有在堆上分配,而是在堆栈上分配。那么,它们是否依赖某种指向可能为null的堆栈的指针,或者底层struct是否包含布尔标志?

4 个答案:

答案 0 :(得分:13)

选项在Swift中实现为enum类型。

有关如何完成此操作的示例,请参阅Apple's Swift Tour

enum OptionalValue<T> {
    case None
    case Some(T)
}

答案 1 :(得分:13)

从昨天起,Swift就是开源的。 您可以在GitHub上看到实现:https://github.com/apple/swift/blob/master/stdlib/public/core/Optional.swift

private boolean mCacheUsed = true;

答案 2 :(得分:3)

选项如下所示实现。要找到这个,CMD-点击var x: Optional<Int>之类的声明。 var x: Int?只是语法糖。

enum Optional<T> : LogicValue, Reflectable {
    case None
    case Some(T)
    init()
    init(_ some: T)

    /// Allow use in a Boolean context.
    func getLogicValue() -> Bool

    /// Haskell's fmap, which was mis-named
    func map<U>(f: (T) -> U) -> U?
    func getMirror() -> Mirror
}

答案 3 :(得分:3)

大多数答案只是说Swift选项是用enum实现的,这引出了enum实现方式的问题。必须使用类似于C中带有标记的联合的东西。例如,Swift枚举

enum Foo {
  case None
  case Name(String)
  case Price(Double)
}

可以在C中模仿如下:

enum {FOO_NONE_, FOO_NAME_, FOO_PRICE_};
typedef struct {
   int flavor; // FOO_NONE_, FOO_NAME_ or FOO_PRICE_
   union {
      char *Name;  // payload for FOO_STRING_
      double Price; // payload for FOO_DOUBLE_
   } u;
} 
相关问题