关于 Optional 的一些实践

1,949 阅读1分钟

为 Optional 添加 extension

extension Optional where Wrapped == String {
    var safeValue: String {
        return self ?? ""
    }
}

var name: String? = "Swift"
print(name ?? "")

name = nil
print(name!) // 强制解包造成 crash

print(name.safeValue) // 无需解包,不存在上述情况

优点:无需解包,从而减少代码因强制解包而出现的问题。

为 Optional 添加单元测试

XCTUnwrap(::file:line:) : 如果表达式为 nil,则测试失败;若不为 nil,测试成功,返回解包的值。

func testNameValue() throws {
    let name: String? = "Swift"
    let unwrappedTitle = try XCTUnwrap(name, "Title should be set")
    XCTAssertEqual(unwrappedTitle, "Swift")
}

Optional Protocol

通过 extension 来实现 optional Protocol。

protocol Eat {
    func eatFish()
    func eatApple() //Optional
}

extension Eat {
    func eatApple() { }
}

struct Cat: Eat {
    func eatFish() {
        print("Dog eat fish")
    }
}

避免嵌入式 Optional

optional 可以重复使用,比如下面的代码:

var name: String?? = "Swift" // 使用这种方式估计会被人打死🤣
print(name!!)

下面给出一种更加可能的使用方式:

let nameAndVersion: [String:Int?] = ["Swift": 5]
let swiftVersion = nameAndVersion["Swift"]
print(swiftVersion) // Optional(Optional(5))
print(swiftVersion!) // Optional(5)
print(swiftVersion!!) // 5

我们应该尽量避免上面的类似的使用。