Стандартная библиотека Swift и конфликт имен

Я знаю, что Swift не использует пространства имен, но эти имена определены в каждом модуле. Во-первых, я не очень хорошо понимаю, как это позволяет избежать коллизий имен - не стесняйтесь уточнить.

Тем не менее, мой главный вопрос: скажем, мне нужна древовидная структура без использования NSTreeNode, поэтому я создаю свой собственный класс с именем «TreeNode». Теперь предположим, что Apple решила включить класс для построения деревьев в стандартную библиотеку Swift, и, как и ожидалось, они назвали его «TreeNode». Что тогда происходит? Мой пользовательский TreeNode будет конфликтовать с TreeNode стандартной библиотеки ... Придется ли мне менять весь свой код в таких случаях? Или, может быть, Apple пообещает, что стандартная библиотека Swift не изменится в будущем?

РЕДАКТИРОВАТЬ: ответ на вопрос здесь (спасибо @Martin R за ваш комментарий)


person George    schedule 10.08.2014    source источник
comment
Это stackoverflow.com/questions / 24002821 / ответьте на ваш вопрос?   -  person Martin R    schedule 10.08.2014
comment
@MartinR Нет, это не ответ на мой вопрос. Или, если это так, я этого не понимаю. Вложенные типы не применимы к этой проблеме. Вещь модулей; Я все еще не понимаю. Но в случае с моим примером TreeNode я не думаю, что модули помогают, потому что стандартная библиотека есть везде. Тем не менее, спасибо за ваш комментарий.   -  person George    schedule 10.08.2014
comment
Взгляните на ответ Мэтта stackoverflow.com/a/24293236/1187415. - В вашем случае это будут TreeNode и Swift.TreeNode.   -  person Martin R    schedule 10.08.2014
comment
Ой! Я видел этот вопрос до того, как написал свой, но пропустил этот ответ. Простите за это. Кажется, это отвечает на мой вопрос, но не полностью: в нем не говорится, применимо ли это к стандартной библиотеке и как это сделать. - Однако это легко проверить: я просто попробую написать собственный класс Array и посмотрю, что скажет компилятор. Большое спасибо!   -  person George    schedule 10.08.2014


Ответы (1)


Пространство имен в Swift неявно. Все классы и другие символы принадлежат цели (модулю), в которой они определены. Итак, если вы определяете класс String, полное имя будет MyTarget.String. Когда возникает конфликт имен, вы должны добавить к имени класса префикс модуля (фреймворка), в котором он определен, за исключением случаев, когда в текущем модуле определен класс с таким именем - этот класс имеет приоритет и не должен быть с префиксом.

struct String {
    var swiftString = ""
}

var a = String()
var b = Swift.String()

Поэтому, если вы создадите свой класс TreeNode, а Apple позже также добавит TreeNode, ваше имя будет иметь приоритет, если вы используете только один модуль, и вам не нужно ничего менять. Если вы хотите использовать Swift TreeNode, вам нужно будет называть его Swift.TreeNode.

person Marián Černý    schedule 10.08.2014