2015-06-05 46 views
6
class MyClass { 
    private var _image: UIImage 

    var image: UIImage { 
     set { 
      if newValue == nil { 
       _image = UIImage(named: "some_image")! 
      } 
     } 
     get { 
      return _image 
     } 
    } 
} 

我的目標是當image被訪問返回吸氣非可選值,同時允許在二傳手可選值

我能做到這一點沒有額外的功能,以保證非可選值?

即使我使用didSet/willSet他們仍然綁定到該UIImage類型,我不能檢查nil ...

回答

4

聽起來像你想要使用隱式解包可選。既然你的getter只是一個非可選的UIImage的包裝器,你知道你的getter將總是產生一個非零值(因爲image被隱式地解開,它將被視爲這樣),但是這也允許你的setter接受零值。也許是這樣的。

class MyClass { 
    private var _image: UIImage // ... 

    var image: UIImage! { 
     get { 
      return _image 
     } 

     set { 
      if let newValue = newValue { 
       _image = newValue 
      } else { 
       _image = UIImage(named: "some_image")! 
      } 
     } 
    } 
} 

image = nil 

將分配_image默認值,

image = UIImage(named: "something_that_exists")! 

將新的圖像分配給_image。請注意,這也允許您從UIImage(named:)分配變量,而不強制展開可選項。如果UIImage的初始化程序因爲找不到圖像而失敗,它將評估爲零,並且仍會導致爲_image分配默認圖像。

+0

不錯!謝謝..! – jovanMeshkov

0

你可以這樣做:

private var image: UIImage = UIImage(named: "some_image")! 

所以圖像被初始化與默認圖像和這個圖像將被使用,如果你沒有設置到另一個。

private var _image: UIImage? 

var image: UIImage? { 
    set { 
     if _image == nil { 
      _image = newValue 
     } 
    } 
    get { 
     return _image 
    } 
} 
+0

嗯,我想它不會工作......我非常想要實現這樣的東西:設置 - > UIImage? {} get - > UIImage {}我想擁有centarlized初始值設定項,所以可以設置nil值而不檢查是否有一些提取的數據,例如nil – jovanMeshkov

+0

我編輯我的答案我認爲這就是你要找的這個case – Icaro

+0

它確定,但如果我打電話myClassObject.image!我將需要用'!'解開它...我只是想直接訪問它,就像myClassObject.image:D – jovanMeshkov

0

你可以使你的支持變量(_image)可選,所以你的公共屬性將不會。使用零合併運算符(??)確定要返回哪個。

class MyClass { 
    private var _image: UIImage? 

    var image: UIImage { 
     set { _image = newValue } 
     get { return _image ?? UIImage(named: "some_image")! } 
    } 
} 
+0

這樣我就不能將它設置爲myClassObject.image = nil ... – jovanMeshkov

+0

你沒有說你想在你的問題中這麼做。 –