Можно добавить расширения к существующим типам объектов Swift, используя расширения, как описано в спецификации языка .
В результате возможно создание расширений, таких как:
extension String {
var utf8data:NSData {
return self.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!
}
}
Тем не менее, какова наилучшая практика именования исходных файлов Swift, содержащих такие расширения?
В прошлом, соглашение было использовать extendedtype+categoryname.m
для типа Objective-C , как описано в руководстве по Objective-C . Но в примере Swift нет названия категории, и называть его String.swift
неуместно.
Таким образом, вопрос заключается в следующем: с учетом вышеуказанного String
расширения, как должен называться исходный файл swift?
ios
objective-c
swift
xcode
AlBlue
источник
источник
ClassName+ExtensionName
формату, и я не вижу, чтобы их использовали слишком много людей. Кроме того, я нахожу это неуклюжим вместо того, чтобы просто определять классы и расширения вместе или давать файлу более точное имя, например,FooAbleTypes
и определять экземпляры в совокупности.Extensions.swift
. Таким образом, вы не потеряете их, и новички в кодовой базе сразу же заметят их. И я бы предпочел, чтобы одноразовые расширения были конфиденциальными для файла, в котором они нужны.Ответы:
Большинство примеров, которые я видел, имитируют подход Objective-C. Пример расширения выше будет:
String+UTF8Data.swift
Преимущества в том, что соглашение об именах позволяет легко понять, что это расширение и какой класс расширяется.
Проблема с использованием
Extensions.swift
или дажеStringExtensions.swift
в том, что невозможно определить назначение файла по его имени, не глядя на его содержимое.Использование
xxxable.swift
подхода, используемого Java, работает нормально для протоколов или расширений, которые определяют только методы. Но опять же, в приведенном выше примере атрибут определяется так, чтоUTF8Dataable.swift
он не имеет большого грамматического смысла.источник
ExtendedType+Functionality.swift
, является ли хорошей практикой сортировка всехString
расширений, например, в их собственную подпапку (т.е.String
илиString Extensions
) вExtensions
папке? Или лучше просто хранить все файлы расширений на одном уровне вExtensions
папке?Свифта нет. Будь проще:
Я создаю один файл для каждого расширяемого класса. Если вы используете один файл для всех расширений, он быстро превратится в джунгли.
источник
Я предпочитаю,
StringExtensions.swift
пока я не добавил слишком много вещей, чтобы разбить файл на что-то вродеString+utf8Data.swift
иString+Encrypt.swift
.Еще одна вещь, объединение одинаковых файлов в один сделает ваше здание быстрее. Обратитесь к разделу «Оптимизация-Сдвиг-Время сборки»
источник
Если у вас есть согласованный командой набор общих и разных улучшений, объедините их вместе в виде Extensions.swift и используйте в качестве решения первого уровня Keep-It-Simple. Однако по мере того, как ваша сложность возрастает, или расширения становятся более сложными, для инкапсуляции сложности необходима иерархия. В таких условиях я рекомендую следующую практику с примером.
У меня был класс, который говорит с моим бэкэндом, называется
Server
. Он начал расти, чтобы охватить два разных целевых приложения. Некоторым людям нравится большой файл, но он логически разделен с расширениями. Я предпочитаю, чтобы каждый файл был относительно коротким, поэтому я выбрал следующее решение.Server
изначально соответствовалCloudAdapterProtocol
и реализовывал все свои методы. Что я сделал, так это превратил протокол в иерархию, сделав ссылку на подчиненные протоколы:У
Server.swift
меня естьServer.swift
затем просто реализует API главного сервера для настройки сервера и получения версии API. Настоящая работа разбита на два файла:Они реализуют соответствующие протоколы.
Это означает, что вам нужно иметь объявления импорта в других файлах (для Alamofire в этом примере), но на мой взгляд, это чистое решение с точки зрения разделения интерфейсов.
Я думаю, что этот подход одинаково хорошо работает как с внешними классами, так и с вашими.
источник
Почему это даже спор? Должен ли я поместить все мои подклассы в файл с именем _Subclasses.swift. Думаю, нет. Swift имеет основанный на модуле интервал имен. Для расширения хорошо известного класса Swift необходим файл, который соответствует его назначению. У меня могла бы быть большая команда, которая создает файл UIViewExtensions.swift, который не выражает никакой цели и может сбить с толку разработчиков и может быть легко продублирован в проекте, который не будет создаваться. Соглашение об именах Objective-C работает нормально, и пока Swift не получит реальный интервал имен, это лучший путь.
источник
Вместо того, чтобы добавлять свои комментарии повсюду, я выкладываю их здесь в одном ответе.
Лично я использую гибридный подход, который дает как хорошее удобство использования, так и ясность, а также не загромождает площадь поверхности API для объекта, который я расширяю.
Например, все, что имеет смысл быть доступным для какой-либо строки, будет содержать,
StringExtensions.swift
например,trimRight()
иremoveBlankLines()
.Тем не менее, если бы у меня была функция расширения, такая как
formatAsAccountNumber()
она не была бы в этом файле, потому что «Номер счета» не является чем-то, что естественно применимо к любым / всем строкам и имеет смысл только в контексте учетных записей. В этом случае я бы создал файл с именемStrings+AccountFormatting.swift
или, может быть, дажеStrings+CustomFormatting.swift
сformatAsAccountNumber()
функцией, если есть несколько типов / способов для его форматирования.На самом деле, в этом последнем примере я активно отговаривал свою команду от использования подобных расширений, и вместо этого поощрял бы что-то вроде
AccountNumberFormatter.format(String)
этого, поскольку это вообще не затрагивает областьString
поверхности API, как это не должно быть. Исключением может быть то, что вы определили это расширение в том же файле, где оно используется, но в любом случае у него не будет собственного имени.источник
Я предпочитаю
+
подчеркивать тот факт, что он содержит расширения:String+Extensions.swift
И если файл становится слишком большим, вы можете разделить его для каждой цели:
String+UTF8Data.swift
String+Encrypt.swift
источник