我该如何在Swift中创建类方法/属性?

101

Objective-C中的类方法(或静态方法)是通过在声明中使用+来实现的。

@interface MyClass : NSObject

+ (void)aClassMethod;
- (void)anInstanceMethod;

@end

如何在Swift中实现此功能?

5个回答

161
他们被称为类型属性类型方法,您可以使用classstatic关键字。
class Foo {
    var name: String?           // instance property
    static var all = [Foo]()    // static type property
    class var comp: Int {       // computed type property
        return 42
    }

    class func alert() {        // type method
        print("There are \(all.count) foos")
    }
}

Foo.alert()       // There are 0 foos
let f = Foo()
Foo.all.append(f)
Foo.alert()       // There are 1 foos

5
我认为这不仅限于Playground,在应用中也无法编译。 - Erik Kerber
@ErikKerber 很好知道,我目前还没有使用到它们,因此还没有亲自测试过,谢谢。 - Pascal
Xcode 6.2仍然会报告“class variables not yet supported”对于任何形式的“class var varName:Type”。 - Ali Beadle
在Swift 2.0及以上版本中,在函数或计算类型属性之前不需要使用"class"关键字。 - Govind Rai

21

在Swift中,它们被称为类型属性和类型方法,您需要使用class关键字。
在Swift中声明类方法或类型方法:


class SomeClass 
{
     class func someTypeMethod() 
     {
          // type method implementation goes here
     }
}

访问该方法:

SomeClass.someTypeMethod()

或者您可以参考Swift中的方法


非常感谢!这甚至比Objective-C中的NSObject类更容易设置,而那已经相当容易了。 - Supertecnoboff

16

如果是类,请在声明前添加class;如果是结构体,请在声明前添加static

class MyClass : {

    class func aClassMethod() { ... }
    func anInstanceMethod()  { ... }
}

这里不需要使用 func 关键字吗? - Jamie Forrest
1
当我站在拥挤的公交车上回答问题时,这对我很有帮助,哈哈。已更正。 - Analog File
Objective-C代码迁移时常被忽视的一个方面是下一个人可能需要将其迁移到某个版本的Swift。这很有帮助,因为我已经完全忘记了Obj-C中类方法的概念,而我正在进行一些混乱的迁移工作。 - truedat101

4

Swift 1.1没有存储类属性。您可以使用一个闭包类属性来实现它,该属性获取与类对象绑定的关联对象。(仅适用于从NSObject派生的类。)

private var fooPropertyKey: Int = 0  // value is unimportant; we use var's address

class YourClass: SomeSubclassOfNSObject {

    class var foo: FooType? {  // Swift 1.1 doesn't have stored class properties; change when supported
        get {
            return objc_getAssociatedObject(self, &fooPropertyKey) as FooType?
        }
        set {
            objc_setAssociatedObject(self, &fooPropertyKey, newValue, objc_AssociationPolicy(OBJC_ASSOCIATION_RETAIN_NONATOMIC))
        }
    }

    ....
}

我一直在学习Swift,想知道是否可以将关联对象附加到Swift类实例。听起来答案是“有点”。(是的,但只能是NSObject的子类对象。)感谢您为我解决这个问题。(已投票) - Duncan C

4

如果是函数声明,使用class或static修饰词,如果是属性声明,使用static修饰词。

class MyClass {

    class func aClassMethod() { ... }
    static func anInstanceMethod()  { ... }
    static var myArray : [String] = []
}

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