Как упоминалось выше:
Разница заключается в определении области.
blockquote>var
привязан к ближайшему функциональному блоку, аlet
привязан к ближайшему закрывающему блоку, который может быть меньше функционального блока. Оба являются глобальными, если вне любого блока. Давайте посмотрим на пример:Example1:
В обоих моих примерах у меня есть функция
myfunc
.myfunc
содержит переменнуюmyvar
, равную 10. В моем первом примере я проверяю, равен лиmyvar
10 (myvar==10
). Если да, я agian объявляю переменнуюmyvar
(теперь у меня есть две переменные myvar), используя ключевое словоvar
и присваиваю ей новое значение (20). В следующей строке я напечатаю его значение на моей консоли. После условного блока я снова распечатаю значениеmyvar
на моей консоли. Если вы посмотрите на выходmyfunc
,myvar
имеет значение равно 20.Пример2: В моем втором примере вместо использования
var
в моем условном блоке объявляюmyvar
с помощью ключевого словаlet
. Теперь, когда я вызываюmyfunc
, я получаю два разных выхода:myvar=20
иmyvar=10
.Таким образом, разница очень проста в его области.
Вы получите это сообщение об ошибке в Xcode 7 (Swift 2), если подкласс объявляет соответствие протоколу, который уже унаследован от суперкласса. Пример:
class MyClass : CustomStringConvertible {
var description: String { return "MyClass" }
}
class Subclass : MyClass, CustomStringConvertible {
override var description: String { return "Subclass" }
}
Журнал ошибок показывает:
main.swift:10:27: error: redundant conformance of 'Subclass' to protocol 'CustomStringConvertible' class Subclass : MyClass, CustomStringConvertible { ^ main.swift:10:7: note: 'Subclass' inherits conformance to protocol 'CustomStringConvertible' from superclass here class Subclass : MyClass, CustomStringConvertible { ^
Удаление соответствия протокола из декларации подкласса решает проблему:
class Subclass : MyClass {
override var description: String { return "Subclass" }
}
Но суперкласс должен объявить соответствие явно, это не будет автоматически выведено из существования свойства description
.
Для гуглеров я также получил эту ошибку, включив SwiftyJson в мою целевую аудиторию и добавив быстрый тестовый класс, поскольку он заставил SwiftyJson снова скомпилироваться и объявляет NSNumber как Comparable. Решение должно было включать его только в целевую программу.
Дело в том, что ваш GraphFeatureNumbersetRange является подклассом NSObject. Что в свою очередь уже соответствует CustomStringConvertible! Это оно! Просто удалите этот избыточный протокол. Теперь вы объявляете это дважды! : -)