С введением Swift я пытаюсь разгадать новый язык
Я разработчик iOS и буду использовать такие типы, как NSString, NSInteger, NSDictionary
в приложении. Я заметил, что в книге Apple "Быстрый язык программирования" Apple используют типы Swift String, Int, Dictionary
Я заметил, что типы Swift не имеют (или называются по-разному) некоторые из функций, которые делают типы Foundation. Например, NSString
имеет свойство length
. Но я не смог найти подобный для Swift String
.
Мне интересно, для приложения iOS я должен использовать типы Foundation?
Вы должны использовать нативные типы 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.
bridgeToObjectiveC()
и объяснение связи между NSString и Swift's String.
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.
Лучше всего использовать родные типы и классы Swift, как некоторые другие отметили, что NSString имеет бесплатный перевод в String, однако они не совпадают на 100%, например, следующие
var nsstring: NSString = "\U0001F496"
var string: String = "\U0001F496"
nsstring.length
count(string)
вам нужно использовать метод count() для подсчета символов в строке, также обратите внимание, что nsstring.length возвращает 2, поскольку он подсчитывает свою длину на основе UTF16.
Аналогично, ДА То же самое, NO
String
и NSString
являются взаимозаменяемыми, поэтому не имеет значения, какой из них вы используете. Вы всегда можете использовать между ними, используя
let s = "hello" as NSString
или даже
let s: NSString = "hello"
NSInteger
- это просто псевдоним для int
или <<26 > (в зависимости от архитектуры), поэтому я просто использовал int
.
NSDictionary
- это другое дело, так как Dictionary
является полностью отдельной реализацией.
В общем, я буду придерживаться быстрых типов, когда это возможно, и вы всегда можете конвертировать между этими двумя при необходимости, используя метод bridgeToObjectiveC()
, предоставляемый быстрыми классами.
Int
, Int
размеру слова архитектуры. NSInteger
также имеет тот же размер, что и размер слова в архитектуре.
Поскольку объективные типы C все еще динамически отправляются, они, вероятно, будут медленнее. Я бы сказал, что вам лучше всего использовать родные типы Swift, если вам не нужно взаимодействовать с API objective-c
Используйте родные типы Swift, когда можете. Однако в случае String у вас есть "бесшовный" доступ ко всем методам NSString
следующим образом:
var greeting = "Hello!"
var len = (greeting as NSString).length
String получает изменения в swift 4. Теперь вы можете напрямую называть счетчик на нем, и он рассматривает кластеры grapheme как 1 часть, как emoji. NSString не обновляется и подсчитывает его по-другому.
var nsstring: NSString = ""
var string: String = ""
print(nsstring.length) // 11
print(string.count) // 1
NSString
не будет обновляться для работы с кластерами графем: это сломало бы слишком много приложений, которые полагаются на старое поведение. Кроме того, NSString.length
подсчитывает символы UTF16.
String
. Тем не менее, функциональностьString
все еще немного ограничена в альфа-версии, поэтомуNSString
будет болееNSString
использоваться. Мы надеемся, что они исправят API до GA.countElements(str)
, чтобы ответить на эту конкретную часть вашего вопроса.