• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

望其项背 iOS - swift: 链式语法,抛出异常,捕获异常,类型判断(is),类型转换(as ...

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

项目地址 https://github.com/webabcd/IosDemo
作者 webabcd

示例如下:

SwiftView11.swift

/*
 * 本例用于演示链式语法,抛出异常,捕获异常,类型判断(is),类型转换(as, as?, as!),Any, AnyObject,嵌套类型
 */

import SwiftUI

struct SwiftView11: View {
    
    var result: String = ""
    
    init() {
        result = sample1() // 链式语法
        result += "\n"
        result += sample2() // 抛出异常,捕获异常
        result += "\n"
        result += sample3() // 类型判断(is),类型转换(as, as?, as!)
        result += "\n"
        result += sample4() // Any, AnyObject
        result += "\n"
        result += sample5() // 嵌套类型
    }

    var body: some View {
        VStack {
            HStack {
                Text(result)
                Spacer()
            }
            Spacer()
        }
    }
    
    func sample1() -> String {
        // 链式语法的使用
        let a = SwiftView11_Class1().func1()!.func1()!.name // webabcd
        let b = SwiftView11_Class1().func1()!.func2()?.name // nil
        let c = SwiftView11_Class1().func1()![0]?.name // nil 或 Optional("webabcd")
        
        // 通过 if...let 实现非空走哪个逻辑,是空走哪个逻辑
        if let x = c {
            print(x)
        } else {
            print("c is nil")
        }
        
        return "\(a), \(b), \(c)"
    }

    func sample2() -> String {
        let a = SwiftView11_Class2()
        
        // defer 代码块会在当前作用域结束后执行(对于本例来说,就是 return 之后会执行此处)
        // 通过 defer 可以实现类似 finally 的作用
        defer {
            print("a: \(a)")
        }
        
        // 通过 dot...try...catch 来捕获异常
        do {
            let b = try a.func1() // 这里要加 try
            print("b: \(b)")
        } catch SwiftView11_Error.unknown1, SwiftView11_Error.unknown2 { // 捕获 SwiftView11_Error.unknown1 异常或 SwiftView11_Error.unknown2 异常
            print("catch: SwiftView11_Error.unknown1 或 SwiftView11_Error.unknown2")
        } catch SwiftView11_Error.error(let x, let y) { // 捕获 SwiftView11_Error.error 异常
            print("catch: \(x), \(y)") // 获取 SwiftView11_Error.error 的两个参数的数据
        } catch { // 捕获其他异常(必须要有这句,否则编译时报错)
            print("catch: \(error)") // 获取 catch 到的 error
        }
        
        // 通过 try? 实现没有异常则返执行结果,有异常则返回 nil(不会抛出异常)
        let c = try? a.func1() // c 是可空类型
        
        // 通过 try! 实现没有异常则返执行结果,有异常则抛出异常(不 catch 的话会崩溃)
        // let d = try! a.func1() // d 是非空类型
        
        return "\(c)"
    }
    
    func sample3() -> String {
        // 通过 is 判断是否是指定类型
        let a = 123 is Int
        
        // 通过类似 Double(xxx) 做类型转换
        let b = Double(123)
        
        // 通过 as 做类型转换
        let c = 123 as Double
        
        // 通过 as 做类型转换
        // let d = "123" as Double // 编译时报错
        
        // 通过 as? 做类型转换
        let e = "123" as? Double // nil
        
        // 通过 as! 做类型转换
        // let f = "123" as! Double // 运行时报错

        return "\(a), \(b), \(c), \(e)"
    }
    
    func sample4() -> String {
        let a = SwiftView11_Class1()
        
        // 不管是值类型还是引用类型,他们都可以用 Any 表示
        var arrayAny: [Any] = []
        arrayAny.append(123)
        arrayAny.append(a)
        
        // 所有引用类型都可以用 AnyObject 表示
        var arrayAnyObject: [AnyObject] = []
        // arrayAnyObject.append(123)  // 编译时报错(因为 123 不是引用类型)
        arrayAnyObject.append(a)
        
        return ""
    }
    
    func sample5() -> String {
        // 访问嵌套类型
        let a = SwiftView11_Class3.SwiftView11_Class3_Enum.e1
        
        return "\(a)"
    }
}


// 用于演示链式语法
class SwiftView11_Class1 {
    func func1() -> SwiftView11_Class1? {
        print("SwiftView11_Class1 func1")
        return self
    }
    
    func func2() -> SwiftView11_Class1? {
        print("SwiftView11_Class1 func2")
        return nil
    }
    
    subscript(index: Int) -> SwiftView11_Class1? {
        get {
            print("SwiftView11_Class1 subscript")
            if Int64(Date.init().timeIntervalSince1970) % 2 == 0 {
                return self
            } else {
                return nil
            }
        }
    }
    
    var name: String = "webabcd"
}


// 用于演示抛出异常
class SwiftView11_Class2 {
    // throws 代表这个方法可能会抛出异常
    func func1() throws -> String {
        let a = Int64(Date.init().timeIntervalSince1970) % 5
        if a == 0 {
            // 通过 throw 抛出复合 Error 协议的异常
            throw SwiftView11_Error.unknown1
        } else if a == 1 {
            throw SwiftView11_Error.unknown2
        } else if a == 2 {
            throw SwiftView11_Error.unknown3
        } else if a == 3 {
            throw SwiftView11_Error.error(code: 123, message: "errorMessage")
        } else {
            return "ok"
        }
    }
}
// 通过 Error 协议来自定义异常实体
enum SwiftView11_Error: Error {
    case unknown1
    case unknown2
    case unknown3
    case error(code: Int, message: String)
}


// 用于演示嵌套类型
class SwiftView11_Class3 {
    // 枚举 SwiftView11_Class3_Enum 定义在类 SwiftView11_Class3 中,这就是所谓的嵌套类型(也就是类中定义其他类)
    enum SwiftView11_Class3_Enum {
        case e1, e2, e3
    }
}

项目地址 https://github.com/webabcd/IosDemo
作者 webabcd


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
iOS 最完整小说阅读器(Swift-Demo)发布时间:2022-07-13
下一篇:
[Swift]LeetCode991.坏了的计算器|BrokenCalculator发布时间:2022-07-13
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap