swift - Swift 枚举中的默认初始化被忽略

标签 swift enums initializer option-type

我正在尝试在 Swift 中重新实现 Optional。我称之为 Maybe。我有 2 个初始化,用于创建空版本或 nil 版本,以及一个包含通用类型的版本:

enum Maybe<T>{
    case Nothing
    case Something(T)

    init(){
        self = .Nothing
    }

    init(_ something: T){
        self = .Something(something)
    }

}

但是,当我尝试创建一个空的 Maybe 时,不会调用 init() 初始化程序。相反,另一个 init(_ something: T) 是用 T = () 调用的。

这是怎么回事?为什么不带参数的init会被忽略?

var z = Maybe() // this calls init(_ something: T) with T = ()

最佳答案

例如,Swift 编译器需要一些上下文来推断类型 T

var foo = Maybe<Int>()
var bar : Maybe<String> = Maybe()

同样的问题会发生在

let x = Optional()
switch x {
case .None:
    println("None")
case .Some(let y):
    println("Some \(y)")
}

它打印 Some () 并导致编译器警告

warning: variable 'x' inferred to have type 'Optional<()>', which may be unexpected

关于swift - Swift 枚举中的默认初始化被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26314603/

相关文章:

ios - 在易出错的初始值设定项 swift 1.2 中分配 let 变量

ios - 如何正确关闭模态视图 Controller ?

swift - Swift 中的通用 MVP 实现

ios - Swift 可选链在闭包中不起作用

java - 为什么枚举在这种情况下比 HashMap 更有用?

c++ - 来自 wiki 的 pow (power) 模板实现

typescript - 通过枚举名称字符串获取枚举值

java - 初始化 JavaBean

swift2 - 当需要自引用时如何在 Swift 中初始化 CBCentralManager

ios - 如果 "submit_instance_key"的值为 1,则在此数组上使用的最佳高阶函数返回 bool 值?