Koşullu Bağlama: let error - Koşullu bağlama için başlatıcı İsteğe bağlı türe sahip olmalıdır


120

Veri Kaynağımdan ve aşağıdaki kod satırından bir satırı silmeye çalışıyorum:

if let tv = tableView {

aşağıdaki hataya neden olur:

Koşullu bağlama için başlatıcı, UITableView değil isteğe bağlı türe sahip olmalıdır

İşte tam kod:

// Override to support editing the table view.
func tableView(tableView: UITableView, commitEditingStyle editingStyle:UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
    if editingStyle == .Delete {

        // Delete the row from the data source

    if let tv = tableView {

            myData.removeAtIndex(indexPath.row)

            tv.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)

Aşağıdakileri nasıl düzeltmeliyim?

 if let tv = tableView {

8
çünkü tableView, isteğe bağlı bir değer değildir, nil olup olmadığını kontrol etmek için bir ihtiyaç vardır. Yani doğrudan kullanabilirsiniz, yani onu kaldırıp if let sadece tableViewişlevde kullanın
Eric Qian

Bu sorunu giderdik sonra kuşaklar için, ben rastladım variable with getter/setter cannot have an initial value: sadece bu cevap ala, başlatmadan sonra artık {} bloğu kaldırarak çözüldü, hangi stackoverflow.com/a/36002958/4544328
Jake T.

Yanıtlar:


216

if let/ if varisteğe bağlı ciltleme, yalnızca ifadenin sağ tarafının sonucu isteğe bağlı olduğunda çalışır. Sağ tarafın sonucu isteğe bağlı değilse, bu isteğe bağlı ciltlemeyi kullanamazsınız. Bu isteğe bağlı bağlamanın amacı nil, değişkeni kontrol etmek ve yalnızca değişken değilse kullanmaktır nil.

Sizin durumunuzda, tableViewparametre isteğe bağlı olmayan tür olarak bildirilir UITableView. Asla olmayacağı garantilidir nil. Bu yüzden burada isteğe bağlı ciltleme gereksizdir.

func tableView(tableView: UITableView, commitEditingStyle editingStyle:UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
    if editingStyle == .Delete {
        // Delete the row from the data source
        myData.removeAtIndex(indexPath.row)
        tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)

Tek yapmamız gereken şeyden kurtulmak if letve tvonun içindeki tüm olayları adil olarak değiştirmek tableView.



16

Özel bir hücre türü kullandığınız bir durumda, örneğin ArticleCell, şunu söyleyen bir hata alabilirsiniz:

    Initializer for conditional binding must have Optional type, not 'ArticleCell'

Kod satırınız şuna benziyorsa bu hatayı alırsınız:

    if let cell = tableView.dequeReusableCell(withIdentifier: "ArticleCell",for indexPath: indexPath) as! ArticleCell 

Aşağıdakileri yaparak bu hatayı düzeltebilirsiniz:

    if let cell = tableView.dequeReusableCell(withIdentifier: "ArticleCell",for indexPath: indexPath) as ArticleCell?

Yukarıdakileri kontrol ederseniz, ikincisinin ArticleCell tipi bir hücre için isteğe bağlı çevrim kullandığını göreceksiniz.


Benim durumumda kullanmam gerekiyorduas! ArticleCell?
lilbiscuit

9

Aynı durum koruma ifadeleri için de geçerlidir . Aynı hata mesajı beni bu gönderiye götürüyor ve cevaplıyor (teşekkürler @nhgrif).

Kod: Kişinin soyadını yalnızca ikinci ad dört karakterden azsa yazdırın.

func greetByMiddleName(name: (first: String, middle: String?, last: String?)) {
    guard let Name = name.last where name.middle?.characters.count < 4 else {
        print("Hi there)")
        return
    }
    print("Hey \(Name)!")
}

Ben ilan dek geçen isteğe bağlı parametre olarak aynı hatayı görüyordum.


4

koşul bağlama isteğe bağlı türe sahip olmalıdır; bu, yalnızca if let deyiminde isteğe bağlı değerleri bağlayabileceğiniz anlamına gelir

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {

    if editingStyle == .delete {

        // Delete the row from the data source

        if let tv = tableView as UITableView? {


        }
    }
}

Bu iyi çalışacaktır, ancak kullandığınızda, isteğe bağlı "?" Türüne sahip olmasına izin verdiğinizden emin olun.


0

Eğer if koşulu içinde olağan değerleri beyan edebilseydik (sözdizimsel olarak) yine de uygun olurdu. Öyleyse, işte bir numara: derleyicinin Optional.some(T)böyle bir değere atama olduğunu düşünmesini sağlayabilirsiniz :

    if let i = "abc".firstIndex(of: "a"),
        let i_int = .some(i.utf16Offset(in: "abc")),
        i_int < 1 {
        // Code
    }
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.