zoukankan      html  css  js  c++  java
  • 望其项背 iOS

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

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

    示例如下:

    SwiftView11.swift

    /*
     * 本例用于演示链式语法,抛出异常,捕获异常,类型判断(is),类型转换(as, as?, as!),Any, AnyObject,嵌套类型
     */
    
    import SwiftUI
    
    struct SwiftView11: View {
        
        var result: String = ""
        
        init() {
            result = sample1() // 链式语法
            result += "
    "
            result += sample2() // 抛出异常,捕获异常
            result += "
    "
            result += sample3() // 类型判断(is),类型转换(as, as?, as!)
            result += "
    "
            result += sample4() // Any, AnyObject
            result += "
    "
            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

  • 相关阅读:
    Spring浅谈
    struts浅谈
    Tomcat启动发生的那些事儿
    sizeof的用法
    栈应用之括号匹配
    条件编译
    MySQL数据库常用命令
    快速排序
    分页查询的那些坑和各种技巧
    国外程序员收集整理的 PHP 资源大全
  • 原文地址:https://www.cnblogs.com/webabcd/p/ios_SwiftView11.html
Copyright © 2011-2022 走看看