【问题标题】:How to Add Another Level to an Extension (categorize like extensions)如何向扩展添加另一个级别(对扩展进行分类)
【发布时间】:2018-03-04 23:57:05
【问题描述】:

我想在一个扩展中使用一堆类似的函数/变异函数,并将它们存储(分类)在一个名称下。所以假设我有这个:

extension Int {

    mutating func addTen() {
        self = self + 10
    }

    mutating func subtractTen() {
        self = self - 10
    }

    mutating func multiplyTen() {
        self = 10 * self
    }

    mutating func divideTen() {
        self = self / 10
    }

}

所以现在如果我想将一个数字的值增加 10,我可以这样做:

var number : Int = 27
number.addTen() // Now number is equal to 37

但我想做的是将所有这些扩展名存储在以下名称下:myOperations

所以理想情况下,我想像这样访问我的扩展:

var number1 = 20
var number2 = 20
var number3 = 20
var number4 = 20

number1.myOperations.addTen() //change to 30
number2.myOperations.subtractTen() //change to 10
number3.myOperations.multiplyTen() //change to 200
number4.myOperations.divideTen() //change to 2 

我尝试这样做:

extension Int {

    struct myOperations {

        mutating func addTen() {
            self = self + 10
        }

        mutating func subtractTen() {
            self = self - 10
        }

        mutating func multiplyTen() {
            self = 10 * self
        }

        mutating func divideTen() {
           self = self / 10
        }
    }
}

但我得到了错误:Binary operator '+' cannot be applied to operands of type 'Int.myOperations' and 'Int'

如何将所有扩展名放在一个名为:myOperations 的分组下​​?

【问题讨论】:

  • 您正在寻找的是命名空间。查看相关问题:How to use namespaces in Swift。但是,AFAIK Swift 不支持在不创建新类型(例如 C++)的情况下定义命名空间(这似乎是“分组”的意思),因此您正在寻找的东西是不可能的。

标签: swift function struct swift-extensions


【解决方案1】:

请注意,以大写字母开头的结构命名是 Swift 惯例。如果你想改变整数,你需要一个方法而不是结构,并让它发生变异。关于您的操作,您需要一个枚举并将其传递给您的变异方法。它看起来像这样:

number1.operations(.addTen)

extension Int {
    enum Operation {
        case addTen, subtractTen, multiplyTen, divideTen
    }
    mutating func operations(_ operation: Operation) {
        switch operation {
        case .addTen:
            self += 10
        case .subtractTen:
            self -= 10
        case .multiplyTen:
            self *= 10
        case .divideTen:
            self /=  10
        }
    }
}

【讨论】:

  • 我想这行得通...但我想以 .addTen 而不是 (.addTen) 的形式访问它
  • 唯一可以改变类型的是可变实例方法,您需要将操作作为参数传递。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多