4

根据官方 Swift 文档(Swift extension doc),Swift 扩展看起来像 Java 枚举。

Swift extensions:

extension Double {
var km: Double { return self * 1_000.0 }
var m: Double { return self }
var cm: Double { return self / 100.0 }
var mm: Double { return self / 1_000.0 }
var ft: Double { return self / 3.28084 }
}

let oneInch = 25.4.mm
print("One inch is \(oneInch) meters")
// prints "One inch is 0.0254 meters"

我试图用 Java 来表示这一点,并提出了以下代码。这个 Java 表示是否正确?还是有任何其他方式来表示这一点?

public enum LengthMetric {

km(1.0e3), mm(1.0e-3), m(1.0e0);

private final double number;

LengthMetric(double number) {
    this.number = number;
}

double getValue(double value) {
    return value * number;
}

public static void main(String[] args) {


    double originalValueInMeters = 3.0;

    System.out.printf("Your value on %s is %f%n", km,
            km.getValue(originalValueInMeters));

    double oneInch = mm.getValue(25.4);
    System.out.printf("One inch on %s is %f%n", m,
            oneInch);

}
}
Your value on km is 3000.000000
One inch on m is 0.025400
4

1 回答 1

11

Swift 扩展与枚举无关。它们提供了一种扩展类的方法,您甚至可能没有源代码。例如:

extension Double {
    func multiplyBy2() {
         return self * 2
    }
}

这将使函数 multiplyBy2 在您的整个应用程序中可用于任何 Double 实例,因此您可以简单地执行以下操作:

let myDouble: Double = 2.0
NSLog( "myDouble * 2: \(myDouble.multiplyBy2())" );

您可以根据需要对一个类进行任意数量的扩展。扩展允许您添加方法和计算属性,但不能添加存储属性。但这可以通过使用 Objective-C 运行时来实现。

Java 不支持这种行为。

但是,Groovy(一种在 JVM 上运行的基于 Java 的动态语言)长期以来一直支持这种行为。使用 groovy,您可以通过将闭包作为属性添加到元类来动态扩展类(非常类似于向 JavaScript 对象添加方法的方式)。

例如:

Double.metaClass.multiplyBy2 = { return delegate * 2 }

这相当于之前的 Swift 扩展。

你可以这样使用它:

Double myDouble = 2.0
println "myDouble * 2: ${myDouble.multiplyBy2()}"
于 2015-06-19T17:07:27.743 回答