我该如何在Swift中创建一个静态类?

20

我想创建一个名为VectorCalculator的静态类。也许这个函数应该放在我的Vector类中(类似于Obj-C中NSString的-stringByAppendingString方法)...如果你认为是这样,请告诉我。

无论如何,我想要向静态类VectorCalculator添加几个静态函数。它将计算“点积”并返回一个向量。另一个函数可能是“计算并返回两个给定向量之间的夹角”。

A)有人会采用创建静态类的方式吗?

B)还是应该将这些函数作为Vector类的实例函数添加,例如public func dotProductWithVector(v: Vector) -> Vectorpublic func angleWithVector(v: Vector) -> Double。然后这两个参数向量v都将应用于Vector类的主向量u

采用A或B的好处是什么?

如果您选择B,则以便日后参考,您将如何在Swift中创建全静态类?


1
这可能会对你有所帮助 http://en.swifter.tips/static-class/ - Stefka Vacheva
2
什么是“静态类”? - Cy-4AH
我对你的方法感到非常困惑。为什么你需要在这里使用静态类? - Kumar KL
@KumarKL 你能把这些方法添加为 Vector 类的实例方法吗? - chris P
5
Swift 中不存在静态类,您所说的是静态方法。关于您的问题:两种方法都可行。然而,在您的情况下,我会选择结构体而不是类,因为向量本质上是值类型。此外,最好为这些向量定义运算符。 - 0x416e746f6e
显示剩余4条评论
3个回答

22

如何在Swift中创建一个全静态类?

static意味着没有实例,所以我会创建一个没有初始化器的结构体:

struct VectorCalculator {
    @available(*, unavailable) private init() {}

    static func dotProduct(v: Vector, w: Vector) -> Vector {
        ...
    }
}

16

如果我理解正确,您对A案例中的类型方法感兴趣。您可以通过在方法的func关键字之前编写static关键字来表示类型方法。类也可以使用class关键字,以允许子类重写超类对该方法的实现。(c)

    struct Vector {
        var x, y, z: Int
    }

    class VectorCalculator {
        static func dotProductOfVector(vec1: Vector, withVector vec2: Vector) -> Vector {
            let newX = //calc x coord;
            let newY = //calc y coord;;
            let newZ = ////calc z coord;;
            return Vector(x: newX,y: newY, z: newZ);
        }
    }

let vec1 = Vector(x:1, y:2, z:3)
let vec2 = Vector(x:4, y:5, z:6)
let v = VectorCalculator.dotProductOfVector(vec1, withVector: vec2)

对于B的好处,这取决于您要解决的任务。如果您想保留原始向量不变,则使用A变体更方便。但我认为您可以提供两种类型的功能。


谢谢!你能解释一下这段 Swift 语法吗?'(_: Vector, )'? - chris P
@chrisP 当然。实际上,这个声明是不正确的,因此我已经编辑了我的答案。为了能够在方法体中使用传递的参数,参数应该有本地参数名称,例如 func method(localNameFirst: Vector, localNameSecond: Vector){}。还有外部参数。它们就像标签一样,增加了代码的可读性。在我的答案中,这个标签(外部参数)是 _withVector_。在“方法的本地和外部参数名称”一节中解释了这一点,可以在这里找到。 - curious
@curious 这是错误的,还是Swift改变了这个?如果您只有一个参数名称,则它作为内部和外部名称,使您的第一个参数成为函数的必需命名参数:VectorCalculator.dotProductOfVector(vec1: vec1, withVector: vec2) 为了允许第一个参数不被命名,您必须在函数头中声明参数,如下所示:static func dotProductOfVector(_ vec1: Vector, withVector vec2: Vector) -> Vector。也许Swift已经改变了这一点?我还在学习,但是当尝试事情时,这似乎是正确的方式。 - Martin Braun

3

我认为您正在寻找类函数?也许您可以在这里找到答案。 如何在Swift中声明类级函数?

class Foo {
    class func Bar() -> String {
       return "Bar"
    }
}

Foo.Bar()

在Swift 2.0中,您可以使用static关键字代替class。但是,对于结构体应该使用static关键字,对于类应该使用class关键字。
//编辑刚刚看到我可能误解了你的问题

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接