SORU
3 HAZİRAN 2014, Salı


Neden oluştur "Örtülü olarak Optionals Açtı"?

Neden "Implicitly Unwrapped Optionals" vs sıradan bir değişken oluşturmak veya sabit.bir oluşturmak istiyorsunuz Eğer başarıyla açılmamış neden ilk etapta isteğe bağlı yaratıyoruz?olduğunu biliyorsanız Örnek neden bu

let someString:String! = "this is the string";

daha kullanışlı vs olacak:

let someString:String = "this is the string";

“Optionals sabit veya değişken olması için izin verildiğini gösterir bir değeri yoktur'.” “Bazen isteğe bağlı her zaman ilk değer ayarlandıktan sonra, bir değeri, bir programın yapısından açıktır” ama İlk etapta isteğe bağlı yapmanın anlamı nedir? İsteğe bağlı her zaman bir değeri olmayacak, biliyorsun... o bunu yapmaz.... isteğe bağlı değil mi?

CEVAP
5 Temmuz 2014, CUMARTESİ


Örtülü olarak Açılmamış Optionals için kullanım durumları tarif edebilirim önce Optionals ve Örtülü olarak Açılmamış Optionals Swift ne olduğunu anlamak gerekir. Eğer yaparsan, seni ilk my article on optionals okuma tavsiye ederim

Örtülü Olarak Açılmamış Bir İsteğe Bağlı Kullanma Zamanı

Bir Örtülü olarak Açılmamış bir İsteğe bağlı yaratacak dört ana nedeni vardır. Yoksa tüm dünya, Hızlı derleyici her zaman açıkça İsteğe bağlı paketini açmak için zorlar, çünkü asla nil zaman erişilen bir değişken tanımlama ile ne ilgisi var.

1. Bu Olamaz Başlatma Sırasında Tanımlanmış Bir Sabittir

Her üye sürekli başlatma tamamlandı zaman bir değeri olması gerekir. Bazen, sürekli olamaz başlatma sırasında doğru değeri ile başlatılması, ama hala erişilen önce bir değer olması garanti edilebilir.

İsteğe bağlı bir değişken kullanarak bir İsteğe bağlı otomatik nil ile başlatıldı ve sonunda içerecek değeri yine değişmez çünkü bu soruna alır. Ancak, sürekli kesinlikle sıfır olmadığını bildiğiniz bir değişken paketini açmak için bir ağrı olabilir. Örtülü olarak Açılmamış Optionals açıkça her yerde açmak zorunda değil yararı ile İsteğe bağlı olarak aynı faydaları elde.

Bu büyük bir örnek görünümü yüklenene kadar üye değişkeni olamaz UİView bir alt sınıfta başlatılması zaman

class MyView : UIView {
    @IBOutlet var button : UIButton!
    var buttonOriginalWidth : CGFloat!

    override func awakeFromNib() {
        self.buttonOriginalWidth = self.button.frame.size.width
    }
}

Burada, görünüm yüklenene kadar düğme orijinal genişlik hesaplanamıyor, ama viewDidLoad görünüm (başlatma dışında) başka bir yöntem daha önce çağrılacak biliyorsun. Açıkça kaydırmaz değeri amaçsızca sınıfın her yerinde zorlamak yerine, dolaylı olarak Açılmamış İsteğe bağlı olarak bildirebilirsiniz.

2. Objective-C API ile etkileşim

Objective-C nesne için her başvuru nil anlamına gelen bir işaretçi. Bu Objective-C API Hızlı bir etkileşim ile her bir nesne için bir başvuru olmadığı için isteğe bağlı olarak kullanılması gerektiği anlamına gelmektedir. Alabilirsin diye normal İsteğe bağlı olarak her iki durumda, ama sen bilirsin tabi ki referans olmayacak nil, kendini kurtarabilirsin açılması kodunu bildirerek bir Örtülü Açılmamış İsteğe bağlı.

Bu iyi bir örnek UITableViewDataSource bir:

override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell? { return nil }

Burada, bu yöntem asla tableView indexPath olarak yer alacaksınız. nil kontrol için zaman kaybı olurdu. Bu tamamen Hızlı bir API idi, Bir ise tüm İsteğe bağlı. olarak ilan olmaz

3. Uygulama Olamaz bir Değişken nil Olmaktan Kurtarmak

Bu olması son derece nadir, ama eğer uygulama olabilir tam anlamıyla değil, devam etmek için Çalıştır eğer bir değişkendir nil dene, o zaman işe yaramaz zaman rahatsız ettiğim için test için nil. Normalde kesinlikle uygulamayı çalıştırmaya devam etmek için doğru olması gereken bir durum varsa, assert kullanırsınız. Örtülü olarak Açılmamış bir İsteğe bağlı olan nil için savunmak bir doğru inşa halinde.

4. NSObject Başlatıcılar

Apple Örtülü Açılmamış Optionals en az bir tuhaf durum var. Teknik olarak, NSObject dönüş devralan bir sınıf tüm başlatıcılar Örtülü olarak Optionals Açılmamış. Bu Objective-C başlatma nil duyulabilir. Hala nil başlatma sonucu test etmek isteyeceksiniz, bazı durumlarda, anlamına gelir. Bu mükemmel bir örnek, eğer görüntü yoksa: UIImage ile

var image : UIImage? = UIImage(named: "NonExistentImage")
if image != nil {
    println("image exists")
}
else {
    println("image does not exist")
}

Eğer sence bir şans bu senin resim yok ve incelikle işleyen senaryo, ilan değişkeni yakalama başlatma açıkça olarak İsteğe bağlı, böylece kontrol edebilirsiniz nil. Ayrıca Örtülü olarak Açılmamış bir Opsiyonel olarak kullanabilirsiniz, ama ben yine de kontrol için planlama olduğundan, daha iyi bir normal İsteğe bağlı kullanabilirsiniz.

Örtülü Olarak Açılmamış Bir İsteğe Bağlı Kullanım İçin Değil

1. Tembel Üye Değişkenleri Hesaplanır

Bazen hiç sıfır olması gereken bir üye değişkeni var, ama başlatma sırasında doğru değere ayarlanamaz. Bir çözüm Örtülü olarak Açılmamış bir İsteğe bağlı, ama daha iyi bir şekilde tembel bir değişken kullanmak için:

class FileSystemItem {
}

class Directory : FileSystemItem {
    lazy var contents : [FileSystemItem] = {
        var loadedContents = [FileSystemItem]()
        // load contents and append to loadedContents
        return loadedContents
    }()
}

Şimdi, 31* *üye değişkeni erişilen ilk kez bu kadar başlatılmadı. Bu sınıfın başlangıç değeri hesaplanırken önce doğru devlet içine almak için bir şans verir.

Not:Bu yukarıdan #1 çelişiyor gibi görünebilir. Ancak, yapılması gereken önemli bir ayrım vardır. buttonOriginalWidth yukarıdaki viewDidLoad boyunca kimseyi özelliği erişmeden önce düğmeleri genişliği değişen önlemek için ayarlanmış olması gerekir.

2. Başka Her Yerde

Çoğunlukla, dolaylı olarak Açılmamış Optionals eğer yanlışlıkla kullanılırsa, tüm uygulama nil erişildiğinde kaza olacak, çünkü kaçınılmalıdır. Eğer bir değişken nil edilebilir olup olmadığı hakkında emin değilseniz, her zaman normal bir İsteğe bağlı kullanarak gerçekler. Asla nil bir değişken açılması kesinlikle çok fazla zarar vermez.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Evan Coury

    Evan Coury

    29 NİSAN 2007
  • ipsy

    ipsy

    1 EKİM 2012
  • Marissah Simonini

    Marissah Sim

    25 HAZİRAN 2013