2016-09-23 18 views
4

在迅速的早期版本,你會得到的白色像這樣UIColor.whiteColor()Swift 3 - 如何編寫新的UIColors等沒有初始化函數的函數?

然而,斯威夫特3,你得到的顏色白色無initialisers像這樣UIColor.white

我怎麼會寫此相同的功能,而無需使用初始值,如UIColor.custom

extension UIColor { 
    func custom() { 
     return UIColor(white: 0.5, alpha: 1) 
    } 
} 
+2

在斯威夫特2,'whiteColor()'是一類功能。在Swift 3中,'white'是一個類變量。 (這不是關於* initialisers *)。 – Codo

回答

5

您可以使用computed properties

extension UIColor { 
    static var custom: UIColor { 
     return UIColor(white: 0.5, alpha: 1) 
    } 
} 
+0

這可能是對的,但編譯器會強制你在你的顏色(變量)名稱上使用大寫字母,因爲它的靜態。我想知道爲什麼從UIKit獲得的內置顏色沒有大寫字母:UIColor.red您怎麼看? – knutigro

+0

@knutigro你有什麼資料嗎?我在操場上面試過了上面的代碼,它工作正常。在我的一個項目中,我經常使用類似的代碼,它編譯沒有錯誤。根據API設計指南,'var's應該以小寫字母開頭。 – FelixSFD

+1

阿哈對此抱歉。我現在意識到,我從我安裝的一個叫做Swift-Clean http://www.swiftcleanapp.com的三方應用程序中得到了這個警告。我猜他們還沒有和Swift 3保持同步。 – knutigro

3
.whiteColor()

UIColor一個static method (type method),而.whiteUIColor靜態(computed in my example) property。在定義它們的區別是這樣的:

struct Color { 
    let red: Int 
    let green: Int 
    let blue: Int 

    static func whiteColor() -> Color { 
    return Color(red: 255, green: 255, blue: 255) 
    } 

    static var white: Color { 
    return Color(red: 255, green: 255, blue: 255) 
    } 
} 
2

它們的屬性,而不是功能。

import UIKit 

extension UIColor { 
    // Read-only computed property allows you to omit the get keyword 
    static var custom: UIColor { return UIColor(white: 0.5, alpha: 1) } 
} 
2

在夫特3.0:

UIColor.whitewhite屬性而不是一個方法/初始化

在早期迅速版本:

UIColor.whiteColor()

white是一個type method

0

像其他人一樣,這是一個屬性。

如果你只使用Swift(沒有Objective C),那麼你可以使用普通的類屬性而不是計算屬性。

extension UIColor { 
    @nonobjc static let custom = UIColor(white: 0.5, alpha: 1) 
} 
0

當編譯器可以推斷你將需要的值的類型,像這裏

let a: Foo = ... 

可以使用靜態成員(方法,功能,存儲的屬性,計算屬性)省略類型的名稱。

所以給定的這種類型

class Foo { 
    static let a = Foo() 
    static var b = Foo() 
    static var c:Foo { return Foo() } 
    static func d() -> Foo { return Foo() } 
} 

可以寫

let a: Foo = .a 
let b: Foo = .b 
let c: Foo = .c 
let d: Foo = .d() 

當值傳遞給函數

func doNothing(foo: Foo) { } 

同樣類型的相同的技術可用於該參數可以由編譯器推斷,以代替編寫

doNothing(foo: Foo.a) 

可以簡單的寫

doNothing(foo: .a)