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

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

Moim celem jest zagwarantowanie wartość nie jest opcjonalny, kiedy image obejrzanoPowrót non wartość opcjonalne w getter, jednocześnie umożliwiając opcjonalną wartość seter

można to osiągnąć bez dodatkowych funkcji?

Nawet jeśli mogę użyć didSet/willSet nadal są zobowiązane do tego UIImage typu i nie mogę sprawdzić nil ...

Odpowiedz

4

Wygląda na to, że chcesz użyć nieopakowanego opcjonalnie elementu opcjonalnego. Ponieważ twój getter jest tylko opakowaniem dla nie-opcjonalnej UIImage wiesz, że twój getter zawsze będzie generował wartość zerową (a ponieważ image jest niejawnie rozpakowany, będzie traktowany jako taki), ale to również pozwoli twojemu setterowi zaakceptować zero wartości. Być może coś takiego.

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")! 
      } 
     } 
    } 
} 

Gdzie

image = nil 

przydzieli _image swoją wartość domyślną, a

image = UIImage(named: "something_that_exists")! 

przypisze nowy obraz do _image. Zauważ, że to również pozwala ci przypisać do zmiennej z UIImage(named:) bez przymusowego rozpakowywania opcjonalnego. Jeśli inicjator UIImage ulegnie awarii, ponieważ nie może znaleźć obrazu, oceni zero i nadal powoduje, że _image zostanie przypisany do domyślnego obrazu.

+0

Nice! Dzięki..! – jovanMeshkov

0

Można po prostu zrobić:

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

więc obraz jest inicjowany z domyślnym obrazem, a ten obraz będzie użyty, jeśli nie ustawisz innego.

private var _image: UIImage? 

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

Hmm, myślę, że to nie zadziała ... chciałem osiągnąć coś takiego: set -> UIImage? {} get -> UIImage {} Chcę mieć centryzowanie inicjalizatora, więc można ustawić wartość zerową bez sprawdzania, czy niektóre pobierane dane są na przykład zerowe. – jovanMeshkov

+0

Edytuję odpowiedź. Myślę, że to jest to, czego szukasz w tym case – Icaro

+0

jest ok, ale jeśli zadzwonię do myClassObject.image! będę musiał go rozpakować za pomocą "!" ... po prostu chcę mieć bezpośredni dostęp do niego, tak jak myClassObject.image: D – jovanMeshkov

0

Można dokonać zmienna podkład (_image) opcjonalne, więc własność publiczna nie będzie. Użyj operatora koalesminacji zerowej (??), aby określić, który z nich powrócić.

class MyClass { 
    private var _image: UIImage? 

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

w ten sposób nie będę mógł ustawić go jako myClassObject.image = nil ... – jovanMeshkov

+0

Nie powiedziałeś, że chcesz to zrobić w swoim pytaniu. –