Hoşgeldin. Soru sormak veya cevaplamak için hemen üye ol.

try-catch hata yakalama

0 oy
203 kez görüntülendi
21, Kasım, 2016 ios development kategorisinde yildirimosman tarafından soruldu
Merhaba,

Swift ile uygulama geliştirirken try-catch kullanınca örneğin en basitinden aşağıdaki gibi

let value1 = "abc"

        do {

           let value2 =  try value1 as! Int

        } catch {

            print("HATA")

        }

Bu şekilde kullanım sonucu uygulama crash oluyor.Acaba bu crash'in engellenmesi için ne yapılabilir?

İyi günler

2 Cevaplar

+2 oy
21, Kasım, 2016 yasin tarafından cevaplandı
22, Kasım, 2016 yildirimosman tarafından seçilmiş
 
En İyi Cevap

property'ler için throw kullanamasınız. Throw sadece fonksiyonlar için kullanılabilir.

property'için Optional Chaining (daha çok bilinen adıyla "Optional Unwrapping") kullanmalısınız.
verdiğiniz örnek üzerinden gidecek olursak;

    var value1:AnyObject?
    // value1 property'si şu an "nil" ve herhangi birşey olabilir.

    // 1 veya 0 döndüren bir random if else caluse ile value1'i 
    // integer veya string olacak şekilde rastgele atıyoruz.

    if arc4random_uniform(2) == 1 {
        value1 = 4 as AnyObject?
    } else {
        value1 = "abc" as AnyObject?
    }


    if let value2:Int = value1 as? Int {
        // optional value1 değeri integer ise
        print("value1 type is integer:\(value2)")
    } else {
        // optional value1 değeri başka birşeyse
        print("value1 type is something else:\(value1)")
    }

detaylar için şuraya bakabilirsiniz.
https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/OptionalChaining.html

21, Kasım, 2016 yildirimosman tarafından yorumlandı
çok teşekkürler Yasin Bey. Bu kullanımı az çok biliyordum peki fonksiyonlar için Throw kullanımına örnek verebilirmisiniz?
+1 oy
22, Kasım, 2016 yasin tarafından cevaplandı

thrown edebilecek bir fonksiyon nasıl oluştururum derseniz;

    import UIKit

    //myFunction fonksiyonumuzun throw edebileceği hatalatı tanınmlayalım.
    //hatta errorDescription'ile localized description'ları bile yazalım.
    //Eğer uygulamanızda localization kullanırsanız 
    //bu LocalizedString'lerde Localizable.String dosyasıyla dillere göre özelleştirebilirsiniz.
    enum MyFunctionError: Error, LocalizedError {
        case someErorr
        case someOtherError
        var errorDescription: String? {
            switch self {
            case .someErorr:
                return NSLocalizedString("My localized description for someErorr", comment: "")
            case .someOtherError:
                return NSLocalizedString("My localized description for someOtherError", comment: "")
            }
        }
    }

    class ViewController: UIViewController  { 


    override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a nib.



            //burada try catch'ile fonksiyonumuzu test edebiliriz.
            do {
                let myString:String = try myFunction()
                print("myString:\(myString)")
            } catch let error {
                print("thorw error:\(error.localizedDescription)")
            }

        }

        //bu fonksiyon string veya yukarıda tanımladığımız iki farklı MyFunctionError tipini thrown edebilir.
        func myFunction() throws -> String {
            // arc4random_uniform ile fonksiyonun ne döndüreceğini rastgele belirleyelim.
            let random = arc4random_uniform(3)
            if random == 1 {
                // throw edilebilecek bir hata.
                throw MyFunctionError.someErorr
            } else if random == 2 {
                // throw edilebilecek bir başka hata.
                throw MyFunctionError.someOtherError
            } else {
                // herşey yolunda.
                return "everything ok"
            }
        }

    override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
}
22, Kasım, 2016 yildirimosman tarafından yorumlandı
çok teşekkürler Yasin Bey çok yardımcı oldunuz.
...