Протокол не поддерживает & ldquo; === & rdquo; оператор?

У меня есть реализация после работы на устройствах iOS, но сбой на устройствах Android

<a  href="mailto:?subject=Your mate might be interested...&body=<div style='padding: 0;'><div style='padding: 0;'><p>I found this on the site I think you might find it interesting.  <a href='@(Request.Url.ToString())' >Click here </a></p></div></div>">Share This</a>
24
задан nbrooks 29 August 2014 в 02:47
поделиться

1 ответ

Сначала давайте посмотрим на определение оператора ===. Это не просто проверка равенства между значениями двух экземпляров, но проверка того, указывают ли две переменные на точно такой же экземпляр объекта ( см. «Операторы идентификации» здесь ).

Итак, ваш пример кода не совсем верен:

var a1 = A()
var a2 = A()
var a3 = a2
a1 === a2     // actually false, a1 and a2 were instantiated separately
a2 === a3     // true, because they are the same instance

Таким образом можно сравнивать только классы, потому что все, что не является классом в Swift, имеет типизированный тип * и два значения. переменные могут не указывать на один и тот же экземпляр.

Поэтому, если вы попытаетесь сравнить обычный протокол с ===, у Swift недостаточно информации для использования оператора. Экземпляры, которые вы сравниваете (p1 и p2), могут быть экземплярами класса, или они могут быть экземплярами структуры, и во время компиляции Swift не может определить, все ли в порядке.

Если вы хотите иметь возможность использовать протокол в качестве типа таким образом и сравнивать с ===, вам нужно объявить протокол только для класса следующим образом: используя class в качестве первого элемента в списке наследования вашего протокола, например:

protocol P : class {
}

class A : P {
}

Теперь вы можете делать то, что пытались, без ошибки компилятора:

var p1:P = a1
var p2:P = a2
var p3:P = a3
p1 === p2    // false
p2 === p3    // true

* Семантически, в любом случае. Swift выполняет много закулисной типизации ссылок, но применяет это типизированное поведение со значениями, поэтому для целей этого обсуждения просто перейдите к struct и enum по-настоящему типизированным значениям.

37
ответ дан Nate Cook 29 August 2014 в 02:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: