当输入为nil时,Swift input == nil产生false。

问题描述 投票:1回答:1

我试图检查一个值是否是 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
swift
1个回答
2
投票

看起来你在处理嵌套的 Optional的时候,有时会发生这种情况。AnyAny? 类型。解决这个问题的一个方法是将嵌套的 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论坛的帖子。

© www.soinside.com 2019 - 2024. All rights reserved.