Hızlı bir şekilde bir uyarı nasıl susturulur


104

Çok sayıda uyarı oluşturan bir kod parçam var (kullanımdan kaldırılmış API)

Clang * kullanarak yapabilirim

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
    ...
#pragma clang diagnostic pop

Ancak bu hızlı bir şekilde çalışmaz.

Hızlı bir şekilde nasıl yapılır?

Not: Uyarıyı genel olarak veya dosya genelinde devre dışı bırakmak istemiyorum, ancak yalnızca kaynak kodumun belirli bir bölümündeki belirli bir uyarıyı devre dışı bırakmak istemiyorum.

Düzenleme: Notum yeterince açık değilmiş gibi görünüyor: Koşullu derleme istemiyorum (bu, sözde kopyanın önerilen cevabıdır). Sadece yeni API'leri KULLANMADAN bir uyarıyı susturmak istiyorum.



4
Bu bir kopya değil. Diğer soru bu soruna cevap vermiyor.
Claus Jørgensen

@ ClausJørgensen bu soruna hangi şekilde cevap veremiyor? Bağlantılı soru cevaplarında belirtildiği gibi başka bir yol yoktur. Yalnızca koşullu derleme veya #availablegeliştiricinin yeni yöntemler kullanması ve yenileri yoksa eskilerine geri dönmesi gereken yeni makro.
zrzka

@robertvojta Hayır, cevaplar yaptığı gibi, aslında, değil bir uyarı susturmak için başka yolları da devlet olduğunu.
Claus Jørgensen

2
Bu bir dupe değil. Bir başlatıcıyı kaçırdığınız için size uyarı verilen bir duruma ne dersiniz?
NSTJ

Yanıtlar:


169

2020 itibariyle, Xcode 12.0, fikir birliği, bunu başarmanın bir yolu olmadığı yönünde.

Apple özelliği eklerse bu yanıtı günceller / düzenlerim.

WWDC 2021 için istek listenize ekleyin!


23
Kahretsin, bu bir serseri. Bazen kontrolden çıkıyor . En azını söylemek can sıkıcı.
Isuru

3
Ben Bu cevap aşağı oylama milyonlarca kez istiyorum, ama o kadar 1 :-) oldukça iyi soruya cevap yok
deadbeef

3
@Isuru Bu noktada, her şeyi yeniden inşa edecek kadar sinirlenirdim. Tahmin et uyarılar işe yaradı
Sirenler

1
@Isuru Bunların çoğu göz ardı edilmemeli, düzeltilmeli.
kevin

3
Çok sinir bozucu! Bu yanıtı güncel tuttuğunuz için teşekkür ederiz.
Dan Loewenherz

51

Swift'de kullanımdan kaldırma uyarılarını susturmak için genel bir yapı yoktur, ancak birçok durumda uygulanabilecek bir geçici çözüm vardır .

Diyelim ki getLatestImage()sınıf Fooüzerinde kullanımdan kaldırılmış yöntemler / sınıflar kullanan bir yönteminiz var .

Metodun içindeki@available tüm uyarıları susturmak için Daniel Thorpe'un açıkladığı gibi kullanın :

@available(iOS, deprecated: 9.0)
func getLatestImage() -> UIImage? {
    ...
}

Artık yöntemi kullanımdan kaldırma uyarısı olmadan çağırmak istiyorsunuz getLatestImage(). Bunu önce bir protokol ve bir uzantı tanımlayarak başarabilirsiniz:

private protocol GetLatestImage {
    func getLatestImage() -> UIImage?
}
extension Foo: GetLatestImage {}

(Ve eğer bir kullanımdan kaldırılması uyarmadan yöntemini çağırın foobir örnek taşımaktadır Foo):

(foo as GetLatestImage).getLatestImage() // no deprecation warning

Sonuç olarak, herhangi bir kullanımdan kaldırma uyarısı olmadan kullanımdan kaldırılmış API'yi kullanan Swift kodunuz var.


Çok zeki. Kötülük mü? :) Ama çok iyi. Kullanımdan kaldırılan, ancak değiştirilen Adres Defteri çerçevesinin bazı yönlerinin devam eden kullanımıyla ilgili uyarıları bastırmak gibi bir kullanım durumu için harika, aslında henüz gerekli tüm işlevleri sağlamıyor. Teşekkürler.
Duncan Babbage

4
Eğer bu işe yararsa, size en sevdiğiniz içkiden altı paket göndereceğim. olağanüstü bir aklınız var efendim, teşekkürler.
John

@John Nazik sözler için teşekkürler! İşe yarıyor, kod tabanımızda uyarıları hata olarak ele aldığımız için onu bulmalıydım ve hala kullanımdan kaldırılmış bir kitaplık kullanan bir bölüm var.
Tammo Freese

1
@John ona altılı paketi gönderdin mi? : P Bu harika. Dahi. Teşekkürler.
Baran Emre

Sen kötü bir dahisin.
Krypt

40

Aslında olabilir kullanarak, bu uyarı bastırmak @availableçevreleyen mantıksal yapısı (yani işlevi / tip).

Örneğin, Adres Defteri çerçevesini kullanan bir kodunuz olduğunu, ancak iOS 9'a göre oluşturduğunuzu varsayalım.

@available(iOS, deprecated: 9.0)
func addressBookStatus() -> ABAuthorizationStatus {
    return ABAddressBookGetAuthorizationStatus()
}

Xcode 7.0.1'den itibaren bu, satır içi uyarıların görüntülenmesini engelleyecektir.


6
Evet, ama aradığınızda addressBookStatus()... kullanımdan kaldırıldı olarak işaretlediğiniz uyarının aynısını göreceksiniz .
Valentin Shergin

4
Profesyonel ipucu: Eğer bütün bir sınıf için bunu susturmak isterseniz sadece sınıf açıklamada yukarıdaki (ex bunuda yukarı slam class ViewController: UIViewController)
Sirenler

2
@Sirens O zaman bu sınıfı her aradığınızda bu uyarıyı göreceksiniz ☹️ (en azından Xcode 8 ile)
Alexander Vasenin

Bu düzeltmeyle, kullanımdan kaldırılan tüm uyarıları susturmayı başaran var mı ? Sayılarını bire indirebildim ama sonuncudan kurtulmanın bir yolunu göremiyorum. Herhangi bir öneri?
Alexander Vasenin

1
Peki uyarı susturmak için bu kullanırım “her zaman başarısız 'CGFloat.NativeType' ilgisiz türüne (aka 'Çift') 'Float' dan döküm” Ben yapıyorum zaman if CGFloat(0).native is Float { … }? Cevap: Soruyu cevaplamadığınız için bunu kullanmıyorum.
Slipp D. Thompson

1

Şimdilik Swift'de kullanımdan kaldırma uyarılarını susturmanın bir yolu olmasa da, teknik olarak bunu başlık dosyasını düzenleyerek belirli bir sembol için yapabilirsiniz.

  • Kullanımdan kaldırılan sembol adını kopyalayın
  • Seç File>Open Quickly
  • Sembolü yapıştırın ve Enter

    Hızlı Aç kutusunda Swift simgesinin devre dışı bırakıldığından emin olun

  • Seç File>Show in Finder

  • Gerekirse düzenlemeye izin vermek için dosya izinlerini değiştirin
  • Sembol için kullanımdan kaldırma makrolarını düzenleyin. Referans için çevredeki API'lara bakın. Örneğin, değiştirin:

__OSX_AVAILABLE_BUT_DEPRECATED (__ MAC_10_6, __MAC_10_10, __IPHONE_3_0, __IPHONE_8_0)

ile

__OSX_AVAILABLE_STARTING (__ MAC_10_6; __IPHONE_3_0)

Şimdi, hiçbir şey yapamayacağınız daha az dikkat dağıtıcı bir uyarı var.

Biliyorum, kirli. Ancak yedek API yoksa mevcut SDK'da , güvenli olmalıdır. Xcode'un yeni bir sürümü çıktığında, değişikliğin üzerine yazılacak ve uyarıyı tekrar göreceksiniz. Ardından, kullanımdan kaldırılan API'nin hala kullanılabilir durumda olduğundan ve bir yedek almadığından emin olmak için yeni SDK ve işletim sistemini test edebilirsiniz.

Herhangi bir olumsuzluk ile karşılaşabilirseniz lütfen yorum yapın.


Beceriklilik için oy vermek ama ağzımda kirli bir tat bırakacaktı: P
Mat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.