2015-11-20 47 views
0

我已經搜索周圍,無法弄清楚我做錯了什麼。我想垂頭喪氣一個UIButton到子類在下面的代碼行:不能縮減UIButton到一個子類

var currentButton: FileButton = UIButton(type: .System) as! FileButton 

FileButtonUIButton一個簡單的子類,它只是存儲與按鈕一對夫婦的變量。代碼如下:

import UIKit 

class FileButton: UIButton { 

    var fileAddress: String = "" 
    var fileMsgId: String = "" 
    var fileAppId: String = "" 

} 

我收到以下錯誤控制檯當我嘗試執行此代碼:

無法投類型的值「的UIButton」(0x19e9c9e40)到 「CollectionFun .FileButton'(0x100127490)。

有什麼想法?這看起來應該很簡單,但我無法弄清楚。謝謝。

回答

1

只需在撥打:

var currentButton: FileButton = FileButton(type: .System) 
0

你可以在你的榜樣不是垂頭喪氣的對象。您創建UIButton類型對象,並嘗試將其轉換爲其他對象,該對象不是其父對象或繼承層次結構中較高的對象,在這種情況下,新對象具有更多功能並需要分配更多內存。你可以讓你的代碼編譯無誤的是這樣的:

var currentButton = UIButton(type: .System) as? FileButton 

但是這將是無用的代碼,因爲它總是會返回nil

爲了更清楚地解釋舉一個例子。你可以這樣做:

var button1 = FileButton() 
button1.fileAddress = "qwerty" 
var button2 = button1 as UIButton 
var button3 = button2 as? FileButton 
print(button3.fileAddress) 

print

可選( 「QWERTY」)

這將是工作becoause第一個對象是FileButton類型。

但這代碼:

var button1 = UIButton() 
var button2 = button1 as? FileButton 
print(button2?.fileAddress) 

將打印

,並嘗試做像第二個例子

0

像其他面向對象的語言,如果你初始化一個變量作爲超類(在你的案例UIButton)你不能將它下注到一個子類(在你的案例中FileButton)。這是因爲您正在初始化一個UIButton對象,該對象不是FileButton。只需更改您的代碼即可初始化一個FileButton對象,它應該可以工作。

因此,您應該用FileButton(type: .System)代替UIButton(type: .System) as! FileButton。請注意,現在不需要強制轉換,因爲我們直接初始化一個FileButton對象。

+0

謝謝(和其他響應者)。這工作。我不知道你可以在子類上使用超類初始化器。 – jhk727

+0

如果答案對您有幫助,如果您可以將其標記爲已接受(點擊答案旁邊的檢查)將會很好。它會幫助其他人提出同樣的問題。 – vigneshv

+0

完成!感謝您的提示 - 我對stackoverflow是新的,用戶界面仍然很混亂。 – jhk727