2016-11-30 28 views
5

Bir projeyi Swift 3'e güncelleştiriyorum ve gideremediğim şu uyarıya rastlıyorum.Swift 3 uyarı: İsteğe bağlı bir denetimde kullanılan 'String' tipi isteğe bağlı olmayan ifade ifadesi

fileprivate var filteredTitlesList: [String] = [] 

if let filteredTitle: String = filteredTitlesList[indexPath.row] as String { // 'Non-optional expression of type 'String' used in a check for optionals' 

    // Do something 

} 

benzer bir sorunun cevabı burada bana yardım etmedi: Non-optional expression of type 'AnyObject' used in a check for optionals

Çok teşekkürler!

+0

guard gibi koşullu açıklamada let keyboardFrame: CGRect = keyboardFrameValue.cgRectValue 'filteredTitlesList' String' elemanı' dizisi, ilgilenmen gerek yok Bu dizideki bir elemanın kendi eleman tipine dönüştürülmesi. Hencem, burada gerçekten isteğe bağlı bir bağlama ihtiyacınız yok. "FiltrelenmişTitlesList", "Any" öğeleri dizisiyse, isteğe bağlı bir bağlayıcı maddede bir dönüşüm ("olarak?") Gerçekleştirebilirsiniz. – dfri

+0

Dize dizisinin bir dizisi var ve ondan öğeyi al, 'String' ve sonra da 'String' olarak yayınla. Ve 'nil' olmasını bekliyoruz. Doğrumuyum? – user28434

+0

Bir dizi diziniz var - ki bu beyanına göre - hiçbir zaman sıfır olamaz. Yani bütün “if” koşulu mantıklı değil. – Codo

cevap

7

Zaten açılmamış bir değeri ayırmaya çalışıyorsunuz ve bu nedenle bir hata alıyorsunuz çünkü yeniden açılmaya gerek duymuyor. Aşağıdaki gibi görünecek şekilde eğer deyimi değiştirin ve altın olmalıdır:

if filteredTitleList.count > indexPath.row { 
    let filteredTitle = filterdTitleList[indexPath.row] 
} 

Maalesef eğer ifadesi içindeki değişken bağlamak için bir yolu yoktur, umarım ileride ekleyebilir edeceğiz.

bu uyarı
+0

Bu, genellikle açık dizinleme tarafından dizilere erişilmeden önce sınırlı denetim için aklı başında bir yaklaşımdır, ancak OP'nin belirli bir durumu için, bir dizinin bir tablo görünümü için veri kaynağı olduğu durumlarda, burada indexPath.row ise bu veri kaynağında temel sorun vardır. 'filterTitleList' için geçersiz bir öğe indeksidir (bu, aslında başka bir yerde bulunan bir sorun için" düzeltme "olacaktır). – dfri

+0

@dfri Kuramsal olarak "filtrelenmişTitleList [indexPath.row]" ifadesi, dizinin aralığını hiçbir zaman aşmamalıdır, aksi taktirde veri kaynağı tamamen bozulur. Güvenli kodlamayı teşvik ediyorum, ancak yine de yapmak için iyi bir alışkanlık. –

+0

Verilen dizin yolunda bir dize olup olmadığını kontrol ediyorum ve eğer varsa, filterTitle öğesine atayın. Değilse, hiçbir şey yapılmamalıdır. Cehaletimi affedin ama yapmama izin verirse bunun neden güvenli olmadığını anlamıyorum. – nontomatic

0

Diğer olasılık da bir açıklama örneğin koymak için çalışıyoruz olduğu : if veya yana