2015-03-30 14 views
9

Ben opsiyonel Swift vardır ama sadece iki '!' Xcode kullanmak istemiyorsanız, bir derleyici hatasıSwift çift Unwrapping

Değerini veren bir “Çift 'İsteğe Bağlı Sarılı karşılaştı anlamak İsteğe bağlı tip 'String?' unwrapped değil; '!' demek istedin mi veya ‘? '?

app, NSRunningApplication türünde aşağıdaki koda sahibim.

let name: String = app.localizedName! 

Neden iki ! kullanmalıyım? var localizedName: String? türünde olduğu için değişkeni kaldırmak için yeterli değil.

Bağlam: Xcode bana let name: String = app.localizedName!! kullanmak istiyorum aksi takdirde yukarıda derleyici hata veriyor. app değişken aşağıdaki gibi tanımlanır:

var apps = NSWorkspace().runningApplications.filter{$0.activationPolicy == NSApplicationActivationPolicy.Regular} 
for app in apps{ 
    //code posted above 
    … 
} 

Yani app isteğe bağlı değildir ve her zaman bir değer olacaktır, ne de isteğe bağlı bir uygulama olduğunu biliyoruz.

P.S. Hızlı numaralandırma kullanırken türü tanımlamanın bir yolu var mı? for Foo(app) in apps gibi, apps = [AnyObject].

+2

"App" nasıl tanımlanmış? Bir isteğe bağlı * NSRunningApplication olabilir mi? –

+0

Cevaplar için tökezliyoruz, çünkü bu kod satırı bu hatayı üretmemelidir. Uygulama isteğe bağlıysa farklı bir hata alırsınız. Ve 'localizedName' bir" çift isteğe bağlı "(lol) değildir. Bu kod satırı iyi görünüyor ve bu hatayı oluşturmamalı. Swift, maalesef yanıltıcı hatalar üretebilir ve asıl sorunun daha önceki bir kod satırında (veya belki de soru hazırlarken kod satırını değiştirdiğinizde veya değiştirdiğinizde) olup olmadığını merak ediyorum. Ayrıca, açıklanamayan hatalar aldığımda, projeyi temizlerim, Xcode'tan çıkarım, türetilmiş veri klasörünü boşalt ve Xcode'u yeniden başlatırım. – Rob

+0

@MartinR Daha fazla bilgi eklendi. Yardım için şerefe. – user14492

cevap

4

sorun NSWorkspace().runningApplications NSRunningApplication bir diziye döküm gereken AnyObject bir dizisi döndürür olmasıdır: neden

let apps = NSWorkspace().runningApplications as! [NSRunningApplication] 
let filteredApps = apps.filter { 
     $0.activationPolicy == NSApplicationActivationPolicy.Regular 
} 
for app in apps { 
    let name: String = app.localizedName! 
} 
+0

Xcode, yukarıdaki kod için bir hata olduğunu gösterir. Muhtemelen 'as' ile' '' 'yerine' ':' 'apps = NSWorkspace(). RunningApplications olarak değiştirin! [NSRunningApplication] ' – Chris

+0

@Chris: Haklısınız, bu Swift 1.2 ile değiştirildi (Xcode 6.3), bana bildirdiğiniz için teşekkürler! –

1

aşağıda açıklanmıştır: app (Objective-C id) tip AnyObject taşımaktadır, ve AnyObject'da herhangi bir arama yapmak, yöntemin nesne üzerinde bulunma olasılığı nedeniyle bir isteğe bağlılık katmanı sunar. localizedName kendisi isteğe bağlıdır, bu nedenle iki seviye isteğe bağlı olarak sonuçlanırsınız: nesne localizedName'a yanıt vermiyorsa dış düzey sıfırdır ve 'localizedName' öğesinin sıfır olması durumunda iç sıfırdır.