С введением Swift я пытался обойти новый язык
Я разработчик iOS и буду использовать такие типы, как NSString, NSInteger, NSDictionary
в приложении. Я заметил, что в электронной книге Apple "Язык программирования Swift" используются типы Swift.String, Int, Dictionary
Я заметил, что типы Swift не имеют (или имеют другие названия) некоторых функций, которые выполняют типы Foundation. Например, NSString
есть length
недвижимость. А вот для Swift аналога найти не удалось String
.
Мне интересно, должен ли я использовать типы Foundation для приложения iOS?
String
. ОднакоString
в альфа-версии функциональные возможности все еще немного ограничены, поэтому на данный моментNSString
они будут использоваться в большей степени. Надеемся, они исправят API до GA.countElements(str)
, чтобы ответить на эту конкретную часть вашего вопроса."foo".length" directly in Swift. An implicit cast to
NSString`, добавляемый за вас компилятором!Ответы:
По возможности следует использовать собственные типы Swift. Язык оптимизирован для их использования, и большая часть функциональных возможностей связана между собственными типами и
Foundation
типами.Хотя
String
иNSString
в основном взаимозаменяемы, т. Е. Вы можете передаватьString
переменные в методы, которые принимаютNSString
параметры, и наоборот, некоторые методы, похоже, на данный момент не соединяются автоматически. См. Этот ответ для обсуждения того, как получить длину строки, и этот ответ для обсуждения использованияcontainsString()
для проверки подстрок. (Отказ от ответственности: я являюсь автором обоих этих ответов)Я не изучал полностью другие типы данных, но предполагаю, что некоторая версия того, что было сказано выше, также будет верна для
Array
/NSArray
,Dictionary
/NSDictionary
и различных числовых типов в Swift иNSNumber
Всякий раз, когда вам нужно использовать один из типов Foundation, вы можете использовать их для явного ввода переменных / констант, как в,
var str: NSString = "An NSString"
или использоватьbridgeToObjectiveC()
для существующей переменной / константы типа Swift, как,str.bridgeToObjectiveC().length
например, в. Вы также можетеString
преобразовать a в объектNSString
с помощьюstr as NSString
.Однако необходимость в этих методах явно использовать типы Foundation или, по крайней мере, некоторые из них, может быть устаревшей в будущем, поскольку из того, что указано в справочнике по языку , например,
String
/NSString
мост должен быть полностью бесшовным.Подробное обсуждение этого вопроса см. В разделах Использование Swift с какао и Objective-C: Работа с типами данных какао.
источник
bridgeToObjectiveC()
и объяснение связи между NSString и Swift String.NSString: создает объекты, которые находятся в куче и всегда передаются по ссылке.
Строка: это тип значения, когда мы его передаем, он передается по значению. как Struct и Enum, String в Swift представляет собой Struct.
Но при прохождении копия не создается. Он создает копию при первом изменении.
Строка автоматически соединяется с Objective-C как NSString. Если в стандартной библиотеке Swift нет, вам необходимо импортировать платформу Foundation, чтобы получить доступ к методам, определенным NSString.
Swift String очень мощный, он имеет множество встроенных функций.
Теперь String может выполнять все операции, которые может выполнять кто угодно с типом Collection.
Для получения дополнительной информации см. Документы Apple.
источник
Лучше всего использовать собственные типы и классы Swift, поскольку некоторые другие отметили, что NSString имеет бесплатный перевод на String, однако они не то же самое на 100%, например, следующие
вам нужно использовать метод count () для подсчета символов в строке, также обратите внимание, что nsstring.length возвращает 2, потому что он считает свою длину на основе UTF16.
Похоже, ДА То же НЕТ
источник
String
иNSString
взаимозаменяемы, поэтому не имеет значения, какой из них вы используете. Вы всегда можете выполнить кастинг между ними, используяили даже
NSInteger
это просто псевдоним дляint
илиlong
(в зависимости от архитектуры), поэтому я бы просто использовалInt
.NSDictionary
Другое дело, посколькуDictionary
это совершенно отдельная реализация.В общем, я бы по возможности придерживался быстрых типов, и вы всегда можете конвертировать между ними при необходимости, используя
bridgeToObjectiveC()
метод, предоставляемый быстрыми классами.источник
Int
книге указано, что тип данных Swift совпадает с размером слова в архитектуре.NSInteger
также того же размера, что и размер слова архитектуры.Поскольку целевые типы C по-прежнему отправляются динамически, они, вероятно, будут медленнее. Я бы сказал, что вам лучше всего использовать собственные типы Swift, если вам не нужно взаимодействовать с API-интерфейсами objective-c.
источник
По возможности используйте собственные типы Swift. Однако в случае String у вас есть «плавный» доступ ко всем таким
NSString
методам:источник
Обновление Swift 4
Строка обновляется в Swift 4. Теперь вы можете напрямую вызвать для нее count, и она будет рассматривать кластеры графем как 1 кусок, как эмодзи. NSString не обновляется и подсчитывает его по-другому.
источник
NSString
s, вероятно, не будет обновлен для работы с кластерами графем: это сломает слишком много приложений, которые полагаются на старое поведение. ТакжеNSString.length
подсчитывает символы UTF16.Строка - это структура
// в Swift Module
публичная структура String
{
}
NSString - это класс
// в модуле Foundation
открытый класс NSString: NSObject
{
}
источник