2015-11-18 67 views
3

究竟是什麼意思一個函數被這樣定義:斯威夫特 - 類和FUNC關鍵字

class Foo { 
    private class func bar() { 
     //do something cool 
    } 
} 

換句話說,什麼是這裏的class關鍵字的目的是什麼?

使用Swift 2.1。

+1

[ 「夫特語言參考」](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/index.html) - >語言指南 - >方法 - >類型方法。 –

回答

5

classstatic方法通過類型而不是實例調用。

let x = NSString.pathWithComponents(["/", "usr", "local", "bin", "brew"]) 

任何類型的可以具有static方法,可以在類只發生class方法。子類可以覆蓋class方法,但不能覆蓋static

class Foo { 
    class func bar() -> String { 
     return "foo bar" 
    } 
    static func baz() -> String { 
     return "foo baz" 
    } 
} 
class Bar: Foo { 
    override class func bar() -> String { 
     return "bar bar" 
    } 
} 
1

它是一個類函數,所以你可以在一個類上調用它,沒有類實例。它與java/C++中的靜態一樣

class A { 
    public class func f() { 
     print("hey") 
    } 
} 

A.f() 
3

它只是在類本身而不是類的一個實例上聲明函數。

class Foo { 
    private class func omg() -> String { 
     return "OMG" 
    } 
} 

Foo.omg() => "OMG" 

調用

let f = Foo() 

f.omg() => Static member 'omg' cannot be used on instance of type 'Foo' 

所以,你可以看到其中的差別

1

class關鍵字的目的,在函數簽名聲明該功能必須在類的類型本身被調用。也就是說,您不需要實例化類的類型的對象,實際上不能在類型的實例上調用此函數。

Cocoa Touch中有這樣的例子。以UIImage(名爲:String)。 UIImage類爲您提供了按照名稱從包中獲取圖像的功能。但是沒有UIImage的實例可以調用這個方法(事實上,因爲這個函數調用是你用來獲取圖像的東西,所以不會有這個函數調用)。