【问题标题】:Enum associated values枚举关联值
【发布时间】:2016-04-05 11:39:37
【问题描述】:

我正在尝试理解 Swift 的枚举。我想为我的枚举案例分配一个关联值并返回一个计算值。目前我正在使用一种方法来返回计算出来的数字。

enum Calculation {
    case Number1(number: Int)
    case Number2(number: Int)

    func calculation() -> Int {
        switch self {
        case Number1(let number): return number + 1
        case Number2(let number): return number + 2
        }
    }
}

我想知道它是否可以做得更短,例如:

// This obviously doesn't work. Just an example as what I'm trying to achieve
enum Calculation: Int {
    case Number1(number: Int): return number + 1
    case Number2(number: Int): return number + 2
}

【问题讨论】:

  • 这个答案可能对您有所帮助。 stackoverflow.com/a/32530320/3222419
  • "I was wondering if it could be done shorter like: example" 您是否甚至费心尝试并发现您的示例不起作用?你有任何研究工作吗?你的语法对我来说甚至没有意义......
  • @DavidWilliames 我看不出链接的答案与此有什么关系。这里没有关于闭包的内容......您是否只是链接了您找到的第一个枚举相关类型问题?
  • @nhgrif- 不,我没有简单地链接我能找到的第一个与枚举相关的问题!看来他试图做的是将“计算”存储为一个枚举,该枚举本质上是对一个数字执行计算并返回它的结果......本质上是想在他的枚举中存储闭包。

标签: swift enums


【解决方案1】:

问题是你是否要使用计算变量:

enum Calculation {
    case Number1(number: Int)
    case Number2(number: Int)

    var value:Int {
        switch self {
        case Number1(let number): return number + 1
        case Number2(let number): return number + 2
        }
    }

}

或者将值存储为关联值:

enum CalculationType {
    case Number1, Number2
}
enum Calculation {

    case Number1(number: Int)
    case Number2(number: Int)

    init (type:CalculationType, number:Int) {
        switch type {
        case .Number1:
            self = Calculation.Number1(number: number + 1)
        case .Number2:
            self = Calculation.Number2(number: number + 2)
        }

    }
}

您的问题指向前者,但我从您的第二段代码中不清楚您是期待后者还是希望初始化会返回一个值,这是不可能发生的(init 不会返回价值)。最接近的是拥有一个静态函数:

enum CalculationType {
    case Number1, Number2
}
enum Calculation {
    case Number1(number: Int)
    case Number2(number: Int)

    static func calc(type:CalculationType, number:Int) -> (Calculation, Int) {
        switch type {
        case .Number1:
            return (Calculation.Number1(number: number), number + 1)
        case .Number2:
            return  (Calculation.Number2(number: number), number + 2)
        }
    }

}

Calculation.calc(.Number1, number: 2)

或者,您可以在 init 上使用回调:

enum CalculationType {
    case Number1, Number2
}
enum Calculation {

    case Number1(number: Int)
    case Number2(number: Int)

    init (type:CalculationType, number:Int, callback:(Int) -> Void) {
        switch type {
        case .Number1:
            self = Calculation.Number1(number: number)
            callback(number + 1)
        case .Number2:
            self = Calculation.Number2(number: number)
            callback(number + 2)
        }

    }

}


Calculation(type: .Number1, number: 10, callback: {n in print(n)})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多