Разрешить необязательному объекту использовать функцию расширения класса Swift - PullRequest
0 голосов
/ 11 июня 2019

Я не уверен, как правильно сформулировать вопрос, и есть довольно похожие вопросы, но они точно не дают мне ответа.

То, что я хочу сделать, в значительной степенипросто.У меня есть модель:

struct Person: Codable {

...
    // And I have a func, or let's put it in an extension:

    func isEqual(to person: Person?) -> Bool {
      return self.id == person?.id
    }

}

И она используется следующим образом, ежу понятно:

let person1: Person!
let person2: Person?
person1.isEqual(to: person2)

Но мне нужна функция, чтобы принять первый объект как дополнительный, например, так:

let person1: Person?
let person2: Person?
person1?.isEqual(to: person2)

Итак, вопрос в том, как заставить такую ​​функцию принимать первый объект как необязательный?

Ответы [ 2 ]

3 голосов
/ 11 июня 2019

Вы спрашиваете:

Итак, вопрос в том, как заставить такую ​​функцию принимать первый объект как необязательный?

Под «первым объектом», я полагаю, вы имеете в виду person1 в вашем примере.

Вы не можете заставить функцию принимать «первый объект» (получатель, person1) как опциональную. Функция определена для типа Person, но person1 имеет тип Optional<Person>.

То, что вы можете сделать, это также определить метод для Optional<Person>, например:

extension Optional where Wrapped == Person {
    func isEqual(to person: Person?) -> Bool {
        // If I’m `.some`, call through to my wrapped value’s isEqual(to:).
        // If I’m nil, I’m only equal to person if person is also nil.
        return self?.isEqual(to: person) ?? (person == nil)
    }
}

С этим методом (и вашим существующим isEqual(to:), определенным для Person), вы можете вызывать isEqual(to:) для Person и Person?.

1 голос
/ 11 июня 2019

Что бы я сделал, чтобы расширить перечисление Optional условием для универсального параметра Wrapped

Это то, на что это было бы похоже

class User: Codable {
    var name: String
    var id: Int
    var age: Int

    ...

    func isEqual(to user: User) -> Bool {
        return self.id == user.id
    }
}

extension Optional where Wrapped == User {
    func isEqual(to user: User?) -> Bool {
        return self?.id == user?.id
    }
}

И так какМетод для разных типов Optional и User, вы можете использовать точечную запись без использования опциональной цепочки.Пример

let user1: User? = nil
let user2: User? = nil
let bool = user1.isEqual(to: user2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...