Swift - какие типы использовать? NSString или String

103

С введением Swift я пытаюсь разгадать новый язык

Я разработчик iOS и буду использовать такие типы, как NSString, NSInteger, NSDictionary в приложении. Я заметил, что в книге Apple "Быстрый язык программирования" Apple используют типы Swift String, Int, Dictionary

Я заметил, что типы Swift не имеют (или называются по-разному) некоторые из функций, которые делают типы Foundation. Например, NSString имеет свойство length. Но я не смог найти подобный для Swift String.

Мне интересно, для приложения iOS я должен использовать типы Foundation?

  • 3
    Предпочитаю String . Тем не менее, функциональность String все еще немного ограничена в альфа-версии, поэтому NSString будет более NSString использоваться. Мы надеемся, что они исправят API до GA.
  • 1
    Кроме того, вы можете позвонить countElements(str) , чтобы ответить на эту конкретную часть вашего вопроса.
Показать ещё 2 комментария
Теги:
string
macos

7 ответов

89
Лучший ответ

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

Хотя String и NSString в основном взаимозаменяемы, т.е. Вы можете передавать переменные String в методы, которые принимают параметры NSString и наоборот, некоторые методы, по-видимому, не соединяются автоматически с этого момента. Посмотрите этот ответ для обсуждения того, как получить длину String, и этого ответа для обсуждения того, как использовать containsString() для проверки подстрок. (Отказ от ответственности: я являюсь автором обоих ответов)

Я еще не полностью исследовал другие типы данных, но я предполагаю, что некоторая версия того, что было сказано выше, будет также верна для Array/NSArray, Dictionary/NSDictionary и различных типов чисел в Swift и NSNumber

Всякий раз, когда вам нужно использовать один из типов Foundation, вы можете либо использовать их для явного ввода переменных/констант, как в var str: NSString = "An NSString" либо использовать bridgeToObjectiveC() для существующей переменной/константы типа Swift, как в str.bridgeToObjectiveC().length например. Вы также можете привести String к NSString, используя str as NSString.

Однако необходимость в этих методах явного использования типов Foundation или, по крайней мере, некоторых из них, может устареть в будущем, поскольку из того, что указано в справочнике по языку, мост String/NSString, например, должен быть полностью бесшовные.

Подробное обсуждение этой темы приведено в разделах Использование Swift с cocoa и Objective-C: Работа с типами данных cocoa.

  • 4
    +1 за ссылку на bridgeToObjectiveC() и объяснение связи между NSString и Swift's String.
  • 2
    эй цезарь, я думаю, что bridgeToObjectiveC устарела, если ты хочешь обновить свой ответ.
Показать ещё 1 комментарий
19

NSString: создает объекты, которые находятся в куче и всегда передаются по ссылке.

Строка: это тип значения всякий раз, когда мы его передаем, он передается по значению. как Struct и Enum, String сама по себе Struct в Swift.

public struct String {
 // string implementation 
}

Но копия не создается при прохождении. Он создает копию при первом ее изменении.

Строка автоматически соединяется с Objective-C как NSString. Если стандартной библиотеки Swift нет, вам нужно импортировать среду Foundation, чтобы получить доступ к методам, определенным NSString.

Swift String очень мощный, он имеет множество встроенных функций.

Инициализация в строке:

var emptyString = ""             // Empty (Mutable)
let anotherString = String()     // empty String immutable    
let a = String(false)           // from boolean: "false"
let d = String(5.999)           //  "    Double "5.99"
let e = String(555)             //  "     Int "555"
// New in Swift 4.2 
let hexString = String(278, radix: 18, uppercase: true) // "F8"

создать строку из повторяющихся значений:

 let repeatingString = String(repeating:"123", count:2) // "123123"

В Swift 4 → Строки - это коллекция символов:

Теперь String способен выполнять все операции, которые любой может выполнить с типом Collection.

Для получения дополнительной информации, пожалуйста, обратитесь к документам Apple.

  • 2
    Этот ответ должен получить больше голосов. В этом принципиальная разница между String и NSString. В другом месте они почти взаимозаменяемы
11

Лучше всего использовать родные типы и классы Swift, как некоторые другие отметили, что NSString имеет бесплатный перевод в String, однако они не совпадают на 100%, например, следующие

var nsstring: NSString = "\U0001F496"
var string: String = "\U0001F496"

nsstring.length
count(string)

вам нужно использовать метод count() для подсчета символов в строке, также обратите внимание, что nsstring.length возвращает 2, поскольку он подсчитывает свою длину на основе UTF16.

Аналогично, ДА То же самое, NO

7

String и NSString являются взаимозаменяемыми, поэтому не имеет значения, какой из них вы используете. Вы всегда можете использовать между ними, используя

let s = "hello" as NSString

или даже

let s: NSString  = "hello"

NSInteger - это просто псевдоним для int или <<26 > (в зависимости от архитектуры), поэтому я просто использовал int.

NSDictionary - это другое дело, так как Dictionary является полностью отдельной реализацией.

В общем, я буду придерживаться быстрых типов, когда это возможно, и вы всегда можете конвертировать между этими двумя при необходимости, используя метод bridgeToObjectiveC(), предоставляемый быстрыми классами.

  • 0
    В книге указан тип данных Swift Int , Int размеру слова архитектуры. NSInteger также имеет тот же размер, что и размер слова в архитектуре.
6

Поскольку объективные типы C все еще динамически отправляются, они, вероятно, будут медленнее. Я бы сказал, что вам лучше всего использовать родные типы Swift, если вам не нужно взаимодействовать с API objective-c

  • 0
    Да, это именно тот ответ. А избежание динамически отправляемых методов и доступа к объектным переменным - это все, что делает эти улучшения скорости, о которых они говорили на WWDC. В прошлом все беспокоились о производительности, используя строки и контейнеры C ++ для получения статической диспетчеризации.
5

Используйте родные типы Swift, когда можете. Однако в случае String у вас есть "бесшовный" доступ ко всем методам NSString следующим образом:

var greeting = "Hello!"
var len = (greeting as NSString).length
3

Обновление Swift 4

String получает изменения в swift 4. Теперь вы можете напрямую называть счетчик на нем, и он рассматривает кластеры grapheme как 1 часть, как emoji. NSString не обновляется и подсчитывает его по-другому.

var nsstring: NSString = ""
var string: String = ""

print(nsstring.length) // 11
print(string.count)    // 1
  • 1
    Скорее всего, NSString не будет обновляться для работы с кластерами графем: это сломало бы слишком много приложений, которые полагаются на старое поведение. Кроме того, NSString.length подсчитывает символы UTF16.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню