В чем разница протокола `: AnyObject` между` none`? - PullRequest
0 голосов
/ 25 сентября 2019

1.

protocol A: AnyObject { }

2.

protocol A { }

Я знаю case 1 может ограничивать тип класса

Но зачем мне ограничивать тип класса

Ответы [ 2 ]

2 голосов
/ 25 сентября 2019

AnyObject требует, чтобы соответствующие типы были классами, а не структурами или перечислениями.Подробнее см. Протоколы только для класса .

Классы предоставляют ссылочную семантику, а не семантику значений, которая может потребоваться для вашего протокола.Например, если вы хотите наблюдать объект, это имеет смысл только для ссылочного типа (вы не можете наблюдать изменения типа значения, так как типы значений копируются при изменении).Подробнее об этом см. Структуры и классы и, в частности, разделы, объясняющие типы значений и ссылок.

Не существует эквивалента типа значения AnyObject.Вы не можете требовать семантики значения для протокола.Это может привести к некоторым головным болям.В качестве примера различия рассмотрим следующее:

protocol Incrementing {
    var value: Int { get set }
}

extension Incrementing {
    func incremented() -> Self {
        var new = self  // Value types copy, reference types reference
        new.value += 1
        return new
    }
}

struct S: Incrementing { var value: Int = 0 }

class C: Incrementing { var value: Int = 0 }

var s = S()
s.incremented().value  // 1
s.value                // 0

var c = C()
c.incremented().value  // 1
c.value                // 1 (!!!)

Этот код имеет смысл для структуры, но содержит ошибки для класса.Сегодня в Свифте нет реального решения этой проблемы.

0 голосов
/ 25 сентября 2019

Извлечение Официальная документация Apple .

В основном говорится, что каждый класс неявно соответствует AnyObject, поэтому вы используете его, когда вам нужно указать тип (например, при создании коллекции,например).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...