我试图检查一个值是否是 nil
但在一个非常特殊的情况下,它总是产生了 false
import Foundation
///
struct Person {
var name: String
var lastname: String
var email: String
var address: String?
var age: Int
}
var contact = Person(name: "", lastname: "", email: "", address: nil, age: 18)
///
protocol Checker {
func check(input: Any?) -> Bool
}
struct Rule<Model> {
var property: PartialKeyPath<Model>
var checker: Checker
}
///
struct Nullability: Checker {
func check(input: Any?) -> Bool {
input == nil
}
}
Nullability().check(input: contact.address) //true, nil indeed
Nullability().check(input: contact[keyPath: \Person.address]) //true, nil indeed
class Test {
var all: [(keypath: PartialKeyPath<Person>, checker: Checker)]
init(all: [(keypath: PartialKeyPath<Person>, checker: Checker)]) {
self.all = all
}
func test(model: Person) -> [Bool] {
all.map { rule in
let value = model[keyPath: rule.keypath]
return rule.checker.check(input: value)
}
}
}
let t = Test(all: [(\Person.address, Nullability())])
t.test(model: contact) // [false], BUT IT SHOULD BE TRUE
看起来你在处理嵌套的 Optional
的时候,有时会发生这种情况。Any
和 Any?
类型。解决这个问题的一个方法是将嵌套的 Optional
以获得真正的封装值。
protocol Flattenable {
var flattened: Any? { get }
}
extension Optional: Flattenable {
var flattened: Any? {
switch self {
case .some(let x as Flattenable): return x.flattened
case .some(let x): return x
case .none: return nil
}
}
}
struct Nullability: Checker {
func check(input: Any?) -> Bool {
input.flattened == nil
}
}
来源: 这个帖子和Swift论坛的帖子。