swift进阶

swift进阶十四:Optional & Equatable &

2020-12-27  本文已影响0人  markhetao

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"

1.2 使用:

1.2.1 枚举方式
var age: Int? = 10

switch age {
case .some(let num):
    print("age为\(num)")
case .none:
    print("值为空")
}
1.2.2 解包

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

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

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

2. if-let

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(作用域)之后的代码

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(值类型)

2.3 class(引用类型)

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

2.5 Optional属性

2.6 =====

@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)

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

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

class HTPerson {
    static let sharedInstance = HTPerson()
    private init() {} // 外界无法调用init方法
}

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

上一篇下一篇

猜你喜欢

热点阅读