Swiftでクラスのメソッド/プロパティを作成するにはどうすればよいですか?


97

Objective-Cのクラス(または静的)メソッドは+、宣言で使用して実現されました。

@interface MyClass : NSObject

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

@end

Swiftでこれをどのように実現できますか?

回答:


152

これらは型プロパティ型メソッドと呼ばれ、classまたはstaticキーワードを使用します。

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に限定されているとは思いません。アプリでコンパイルすることもできません。
エリックカーバー2014

@ErikKerber知っておくと、まだ必要ではなかったので、自分でテストしていないので、ありがとう。
Pascal

Xcode 6.2は、「class var varName:Type」の形式のいずれに対しても「まだサポートされていないクラス変数」を報告します。
Ali Beadle 2015

Swift 2.0以降ではclass、関数や計算タイププロパティの前にキーワードは必要ありません。
Govind Rai

20

これらはSwiftでは型プロパティと型メソッドと呼ばれ、classキーワードを使用します。
swiftでクラスメソッドまたはTypeメソッドを宣言する:

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

そのメソッドにアクセスする:

SomeClass.someTypeMethod()

または、迅速にメソッドを参照できます


どうもありがとうございます!これはObjective-CのNSObjectクラスよりもさらに簡単で、すでにセットアップがかなり簡単でした。
Supertecnoboff 2016年

14

classそれがクラスであるstatic場合、またはそれが構造体である場合は、宣言の前に追加します。

class MyClass : {

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

funcここにキーワードは必要ありませんか?
ジェイミーフォレスト

1
もちろん。混雑したバスに立ちながら質問に答えてくれます(笑)。修正。
アナログファイル

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のサブクラスであるオブジェクトのみ。)解決してくれてありがとう。(投票)
ダンカンC

4

関数の場合は宣言の前にクラスまたは静的を、プロパティの場合は静的を宣言の前に追加します。

class MyClass {

    class func aClassMethod() { ... }
    static func anInstanceMethod()  { ... }
    static var myArray : [String] = []
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.