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

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

Mein Ziel ist es nicht optionalen Wert zu garantieren, wenn image zugegriffen wird, während optionalen Wert ermöglicht in Setter

Kann ich dies erreichen, ohne zusätzliche Funktion?

Auch wenn ich verwende didSet/willSet sie noch in diesem UIImage Typ gebunden sind, und ich kann nicht überprüfen nil ...

Antwort

4

Klingt so, als ob Sie ein implizit unwrapped optional verwenden möchten. Da Ihr Getter nur ein Wrapper für ein nicht optionales UIImage ist, wissen Sie, dass Ihr Getter immer einen Nicht-Nil-Wert erzeugt (und da image implizit ausgepackt wird, wird es als solches behandelt), aber dies erlaubt Ihrem Setter auch, Nil zu akzeptieren Werte. Vielleicht so etwas.

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

Wo

image = nil 

_image Ihr Standardwert zuweisen, und

image = UIImage(named: "something_that_exists")! 

wird das neue Bild _image zuweisen. Beachten Sie, dass Sie damit auch die Variable UIImage(named:) zuweisen können, ohne die Option zwangsweise auszupacken. Wenn der Initiator von UIImage fehlschlägt, weil er das Bild nicht finden kann, wird es als null ausgewertet und bewirkt weiterhin, dass _image Ihrem Standardbild zugewiesen wird.

+0

Schön! Vielen Dank..! – jovanMeshkov

0

Sie können einfach tun:

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

So Bild initialisiert mit einem Standardbild und dieses Bild wird verwendet, wenn Sie nicht auf ein anderes Bild setzen.

private var _image: UIImage? 

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

Hmm, ich schätze, es wird nicht funktionieren ... ich möchte so etwas erreichen: set -> UIImage? {} get -> UIImage {} Ich möchte den Initialisierer centarisiert haben, so dass es möglich ist, einen Nullwert zu setzen, ohne zu prüfen, ob einige abgerufene Daten zum Beispiel null sind – jovanMeshkov

+0

Ich bearbeite meine Antwort Ich denke, das ist, wonach Sie suchen Fall – Icaro

+0

ist in Ordnung, aber wenn ich myClassObject.image aufrufen! ich werde es mit '!' auspacken müssen ... ich möchte nur direkt darauf zugreifen wie myClassObject.image: D – jovanMeshkov

0

Sie können Ihre Unterstützung Variable (_image) optional, so dass Ihr öffentliches Eigentum wird nicht machen. Verwenden Sie den Nullkoaleszenzoperator (??), um zu bestimmen, welche zurückgegeben werden soll.

class MyClass { 
    private var _image: UIImage? 

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

So kann ich es nicht als myClassObject.image = nil ... setzen – jovanMeshkov

+0

Sie haben nicht gesagt, dass Sie das in Ihrer Frage tun wollten. –