2014-07-01 119 views
3

我有一個叫MyView.swift文件看起來就像這樣:子類的UIView斯威夫特 - 錯誤

class MyView : UIView { 

} 

我也有帶班設置爲MyView的景色的MyView.xib文件。

在一個視圖控制器我有這樣的:

var myView: MyView? 

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.myView = NSBundle.mainBundle().loadNibNamed("MyView", owner: nil, options: nil)[0] as MyView 
    self.myView.frame = frame; 
    self.view.addSubview(self.myView); 

} 

我得到這個錯誤:

MyView? does not have a member named 'frame' 

爲什麼? MyView是UIView的子類...

回答

4

您必須隱式展開該可選項,或者使用可選的鏈接。

self.myView!.frame = frame 

或利用可選的鏈接。

self.myView?.frame = frame 
// can do this now in Swift. 

第一個選項是因爲當你用力解開一個可選的更危險,它是nil,會發生運行時錯誤。

編輯我很抱歉,可選的鏈接不是這裏工作的正確工具。如果你想查詢幀的值,它是正確的工具。或者,您可以使用if let語法。

if let optionalView = self.myView { 
    var queriedFrame = optionalView.frame 
} 
+1

self.myView?.frame = frame給了我「不能分配給這個表達式的結果」 – soleil

+1

可選鏈只適用於右值 - 你不能分配給可選鏈表達式。您可以分配給force-unwrapped引用,或者在'if-let'塊內分配。 – rickster

+0

謝謝,雖然我不確定queriedFrame行是關於什麼。如果我用'optionalView.frame = frame'替換它就可以。 – soleil

3

MyViewUIView一個亞類中,但MyView?是可選的,其僅具有兩種可能情況:

(1)它是nil,或

(2)它包含類型的包裝值MyView

...並在任一個cas e,它仍然是一個可選的,這意味着它沒有一個名爲'frame'的成員:)但是如果它保留了一個包裝值MyView那麼這個包裝值就是!

要獲得該包裝值(假設它有一個值),您需要明確地將其打包爲!,或者您需要使用可選綁定(if let)來訪問其屬性。