2014-07-01 70 views
7

我看着這斯威夫特教程並沒有這一行:作爲UIButton在swift中的UIButton?

var button:UIButton = UIButton.buttonWithType(UIButtonType.System) as UIButton 

兩個問題:

  1. 這是爲什麼符合as UIButton結束?這行不夠清楚,用戶想要創建一個系統類型的按鈕?這似乎是多餘的。
  2. 是否有必要在該行的第一部分聲明UIButton類型?或者換句話說,是不夠的,聲明它像

VAR鍵= UIButton.buttonWithType(UIButtonType.System)

我的意思是,如果等號後的部分被初始化系統類型的按鈕不夠編譯器推斷buttonUIButton?我的意思是,蘋果說編譯器聰明地推斷類型。

+0

許多** **你的問題是,我也想問*好奇*基本問題(但我猜你在學習曲線上比我早2年)。通常你不會找到這樣的問題的答案,除非在SO上被問到。 – Honey

回答

10

你需要保持as UIButton向下。 buttonWithType() return AnyObject!,而不是UIButton,所以downcast是必要的。除此之外,您不需要使用: UIButton明確輸入變量。由於buttonWithType()的返回類型向下轉換爲UIButton,因此變量類型將被推斷爲UIButton。這是你應該使用什麼:

var button = UIButton.buttonWithType(UIButtonType.System) as UIButton 
+11

而其根本原因似乎是Objective-C方法'buttonWithType:'被聲明爲返回'id'而不是'instancetype'。 –

+2

來自Martin的完美anser和完美評論!現在我看到,AnyObject! = id!謝謝!!! – SpaceDog

+0

從Swift 1.2開始,你需要使用'as!'強制執行一個downcast –

2

如果CMD點擊buttonWithType你會看到,在迅速的聲明爲

class func buttonWithType(buttonType: UIButtonType) -> AnyObject! 

因爲它返回的類型是AnyObject!你需要輸入回到UIButton。

+3

它實際上是一個可選的,它可以是nil – Sulthan

+0

你是對的,我在前面想,會編輯我的文章,感謝你的支持。 –

7

除了已經給出答案,一些額外的背景: Objective-C的方法

+ (id)buttonWithType:(UIButtonType)buttonType 

回報id。這是以「傳統」方式申報「工廠方法」的方式,因爲它也可以從子類中使用 。沒有類型在

UIButton *button = [UIButton buttonWithType: UIButtonTypeSystem]; 

投必要的,因爲id可被轉化爲任何Objective-C的指針。

現在夫特等效類型idAnyObject,並且上述方法被映射到

class func buttonWithType(buttonType: UIButtonType) -> AnyObject! 

夫特得多嚴格和不隱性轉換的類型,因此返回值必須是轉換爲UIButton明確:

var button = UIButton.buttonWithType(UIButtonType.System) as UIButton 

「現代」 Appro公司ach宣佈工廠方法是instancetype(請參閱http://nshipster.com/instancetype/Would it be beneficial to begin using instancetype instead of id?)。一個簡單的例子是 的NSString方法

+ (instancetype)stringWithCString:(const char *)cString encoding:(NSStringEncoding)enc 

其在夫特映射到

class func stringWithCString(cString: CString, encoding enc: UInt) -> Self! 

Self是在其上調用方法的對象的類型,從而使 的

返回類型
NSString.stringWithCString("foo", encoding: NSUTF8StringEncoding) 

NSString!和返回類型

NSMutableString.stringWithCString("bar", encoding: NSUTF8StringEncoding) 

NSMutableString!Swift中不需要類型轉換。在下面的例子 ,雨燕編譯器「知道」 strNSString

var str = NSString.stringWithCString("foo", encoding: NSUTF8StringEncoding) 
var cs = str.UTF8String 

Foundation框架頭已經在很多地方使用instancetype,但不 尚未無處不在可能情況下(如在buttonWithType:)。這可能會在 SDK的未來版本中得到改進。

+0

這些按鈕是怎麼樣的* class *方法?或者,UIButton的**實例**等於UIButton的工廠方法/類方法之一? – Honey

+0

@Honey:'UIButton.buttonWithType(...)'是一個類方法(或者更好:在Swift 1中是類方法)。 –

+0

我得到的那部分,但不要混淆,因爲在如何變異,即是一個實例是從一個類的方法派生 – Honey

0

雨燕2.1是現在

var button = UIButton(type: .System) 

所以沒有必要用.buttonWithType向下轉型