Hoşgeldin. Soru sormak veya cevaplamak için hemen üye ol.
0 oy
722 kez görüntülendi
ios development kategorisinde tarafından
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
tarafından
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

tarafından
çok teşekkürler Yasin Bey. Bu kullanımı az çok biliyordum peki fonksiyonlar için Throw kullanımına örnek verebilirmisiniz?
+1 oy
tarafından

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.
        }
}
tarafından
çok teşekkürler Yasin Bey çok yardımcı oldunuz.
...