美文网首页swift进阶
swift进阶十四:Optional & Equatable &

swift进阶十四:Optional & Equatable &

作者: markhetao | 来源:发表于2020-12-27 00:17 被阅读0次

    swift进阶 学习大纲

    上一节,我们介绍了闭包,本节,我们介绍:

    1. Optional
    2. Equatable
    3. Comparable
    4. 访问控制(private、fileprivate、internal、public、open)

    1. Optional

    Optionalenum结构,包含somenone两个case项。是一个包含nil类型
    (所以Optional类型size就是enum大小2个caseenum本身大小为1,加上最大case关联内容(Wrapped类型)大小(如: Optional<String>、Optional<Int>))

    public enum Optional<Wrapped>: ExpressibleByNilLiteral {
      case none
      case some(Wrapped)
    }
    

    1.1 创建:

    // 快捷创建
    var age: Int? = 10
    
    // 普通创建
    var name: Optional<String> = "ht"
    
    • 打印结果为Optional类型
      image.png

    1.2 使用:

    1.2.1 枚举方式
    • 因为Optional本身是enum类型,所以可使用switch模式匹配
    var age: Int? = 10
    
    switch age {
    case .some(let num):
        print("age为\(num)")
    case .none:
        print("值为空")
    }
    
    1.2.2 解包

    涉及到Optional可选类型,我们就必须解包,因为我们关注的更多是some值

    • 但是每次switch处理,会让我们代码量增大的同时,影响阅读体验(因为我们实际只关心some值)
    • 以下是三种解包方式(推荐第二、第三种):

    1. !强解包
    非常不建议使用强解包。因为如果遇到nil,程序直接crash

    image.png
    • 很多都说使用!强解包,表示程序员对自己的代码足够自信,并愿意承担crash结果
    • 我想说的,真实业务场景下,作为开发者,你必须保证你的代码足够健壮,即便一定不会nil,也不要! 强解包
    • 因为你不确定这份代码逻辑以后会不会被他人改动。所以我建议所有! 强解包的场景,可以选择性使用Assets断言,再使用下面第二第三种方式。

    2. if-let

    • if-let 可以配合else使用,也可以直接在if中添加return,表示后续代码都是else场景下,节省了else{},提高代码可读性
    var age: Int? = nil
    
    // 可以配合return使用, 省了else的{}
    //if let value = age {
    //    print("value \(value)")
    //    return
    //}
    
    if let value = age {
        print("value \(value)")
    } else {
        print("age 为 nil")
    }
    

    3 guard-let
    guard-let是具备守护功能,它必须搭配return使用,排除异常情况,守护guard(作用域)之后的代码

    • guard中的条件,如果不满足,执行guard内的代码后returnguard(作用域)之后的代码,一定是全部满足guard条件的。
      image.png

    if-letguard-let使用建议

    • 实际开发过程中,我们希望代码从上至下能清晰表达主线流程

    • guard-let一般用于处理非主线异常情况,直接return出去,守护主线代码。

    • if-let一般用于处理主线重要场景。

    if-let创建的内容,仅在if 作用域内可访问。guard-let创建的内容,是供guard 作用域外访问。

    2. Equatable

    Swift中的类型,可以通过遵循Equatable协议来使用相等运算符(==)不等运算符(!=)

    image.png

    2.1 绝大多数类型默认实现Equatable协议

    image.png

    2.2 struct(值类型)

    • 值类型支持直接比较,所以只需要遵循Equatable协议,就自动实现(==)(!=)
      image.png

    2.3 class(引用类型)

    • 引用类型需要先遵循Equatable协议,再手动实现(==)(!=)
      image.png

    2.4 struct引用类型属性(值类型+引用类型)

    • 值类型中包含引用类型实例。必须实现引用类型Equatable (==)函数,会根据Equatable (==)进行判断:
      image.png

    2.5 Optional属性

    • 可选值属性,需要先拓展Optianl==比较方式:
      image.png

    2.6 =====

    • == 用来检验是否相等,需要遵循Equatable协议。也就是equal to
    • ===是用来检验两个对象是否是同一个实例对象(内存地址是否相等)。不支持值类型,仅支持类实例(AnyObject?)使用。
    @inlinable public func === (lhs: AnyObject?, rhs: AnyObject?) -> Bool
    @inlinable public func !== (lhs: AnyObject?, rhs: AnyObject?) -> Bool
    
    image.png

    3. Comparable

    Comparable协议继承了Equatable协议,并多支持了其他比较方式

    public protocol Comparable : Equatable {
        static func < (lhs: Self, rhs: Self) -> Bool
        static func <= (lhs: Self, rhs: Self) -> Bool
        static func >= (lhs: Self, rhs: Self) -> Bool
        static func > (lhs: Self, rhs: Self) -> Bool
    }
    extension Comparable {
        public static func ... (minimum: Self, maximum: Self) -> ClosedRange<Self>
        @inlinable public static func > (lhs: Self, rhs: Self) -> Bool
        @inlinable public static func <= (lhs: Self, rhs: Self) -> Bool
        @inlinable public static func >= (lhs: Self, rhs: Self) -> Bool
        public static func ..< (minimum: Self, maximum: Self) -> Range<Self>
        prefix public static func ..< (maximum: Self) -> PartialRangeUpTo<Self>
        prefix public static func ... (maximum: Self) -> PartialRangeThrough<Self>
        postfix public static func ... (minimum: Self) -> PartialRangeFrom<Self>
    }
    
    image.png

    4. 访问控制(private、fileprivate、internal、public、open)

    • OC很少接触这个概念,Swift中针对源文件模块的代码,提供了不同程度访问控制
      访问级别从低到高依次是:
      private<fileprivate<internal<publicopen

    • private: 访问级别仅在当前定义作用域内

    class HTPerson {
        private var age = 10
    }
    HTPerson().age // 访问不到age
    

    利用private权限,我们swift单例正规写法为:

    class HTPerson {
        static let sharedInstance = HTPerson()
        private init() {} // 外界无法调用init方法
    }
    
    • filePrivate: 访问级别仅在当前定义文件内
    • Internal: 默认访问级别。允许模块中任意文件访问(模块外不支持访问) (import的都是模块)
    • public: 开放式访问,允许任何模块任何文件访问,但只支持定义模块内继承和子类重写
    • open: 开放式访问,最不受限制,允许任何模块任何文件访问、继承和子类重写

    本节知识较简单,所以相关SIL分析没罗列了。Optional访问控制使用频次。下一节,分析协议泛型

    相关文章

      网友评论

        本文标题:swift进阶十四:Optional & Equatable &

        本文链接:https://www.haomeiwen.com/subject/lonmnktx.html