Являются ли Int, String и т.д. Считающимися "примитивами" в Свифте?
Типы, представляющие числа, символы и строки, реализованные с использованием структур в swift.
Отрывок из официальной документации :
Типы данных, которые обычно считаются базовыми или примитивными в других языки, такие как типы, которые представляют числа, символы и строки - фактически называются типами, определенными и реализованными в Swift стандартная библиотека с использованием структур.
Означает ли это следующее:
Int
Float
String
// etc
... не считаются примитивами?
Ответы
Ответ 1
Да и нет...
Как отмечают другие ответы, в Swift нет различий на уровне языка между вещами, которые, как считается, являются "примитивами" на других языках, а также другими типами структур в стандартной библиотеке или типами значений, которые вы можете создать самостоятельно. Например, это не похоже на Java, где существует большая разница между int
и Integer
, и невозможно создать свои собственные типы, которые ведут себя семантически подобно первому. В Swift все типы являются "непримитивными" или "пользовательскими": особенности языка, которые определяют синтаксис и семантику, скажем, int
, ничем не отличаются от тех, которые определяют CGRect
или UIScrollView
или ваши собственные типы.
Однако все еще существует различие. ЦП имеет собственные инструкции для таких задач, как добавление целых чисел, умножение поплавков и даже перенос векторных кросс-продуктов, но не такие, как вставки или списки поиска. Одна из вещей, о которых люди говорят, когда они называют некоторые типы языков "примитивно", - это те типы, для которых компилятор предоставляет перехваты в базовой архитектуре ЦП, так что вещи, которые вы делаете с этими типами, сопоставляются непосредственно с базовым процессором инструкции. (То есть, такие операции, как "добавить два целых числа", не увязнут в поиске объектов и вызовы функций.)
У Swift все еще есть это различие - некоторые стандартные типы библиотек, такие как int
и Float
, являются особыми, поскольку они сопоставляются с основными операциями ЦП. (И в Swift компилятор не предлагает никаких других средств для прямого доступа к этим операциям.)
Разница со многими другими языками заключается в том, что для Swift различие между "примитивными" типами и иначе является деталью реализации стандартной библиотеки, а не "особенностью" языка.
Просто чтобы побродить по этому вопросу еще...
Когда люди говорят о том, что строки являются "примитивными" типами на многих языках, другое значение слова - строки является уровнем абстракции дальше от CPU, чем целыми числами и плаваниями.
Строки, являющиеся "примитивными" на других языках, обычно означают что-то вроде этого на C или Java: у компилятора есть специальный случай, когда помещение чего-то в кавычки приводит к тому, что некоторые данные встроены в двоичный код программы, а место в коде где вы написали, что получаете указатель на эти данные, возможно, завернутый в какой-то объектный интерфейс, чтобы вы могли делать с ним полезную обработку текста. (То есть, строковый литерал.) Возможно, у компилятора также есть специальные случаи, чтобы вы могли иметь удобные ярлыки для некоторых из этих процедур обработки текста, например +
для конкатенации.
В Swift String
является "примитивным" в том смысле, что это стандартный тип строки, используемый всеми текстовыми функциями в стандартной библиотеке. Но нет никакой магии компилятора, позволяющей вам создавать свои собственные типы строк, которые могут быть созданы с помощью литералов или обрабатываться операторами. Таким образом, гораздо меньше различий между "примитивами" и пользовательскими типами в Swift.
Ответ 2
Нет, они не примитивы в том смысле, что другие языки определяют примитивы. Но они ведут себя так же, как примитивы, в том смысле, что они передаются по значению. Это связано с тем, что они внутренне реализуются структурами. Рассмотрим:
import Foundation
struct ByValueType {
var x: Int = 0;
}
class ByReferenceType {
var x: Int = 0;
}
var str: String = "no value";
var byRef: ByReferenceType = ByReferenceType();
var byVal: ByValueType = ByValueType();
func foo(var type: ByValueType) {
type.x = 10;
}
func foo(var type: ByReferenceType) {
type.x = 10;
}
func foo(var type: String) {
type = "foo was here";
}
foo(byRef);
foo(byVal);
foo(str);
print(byRef.x);
print(byVal.x);
print(str);
Выходной сигнал
10
0
no value
Ответ 3
Как и Ruby, Swift не имеет примитивных типов.
Int на пример реализован как struct
и соответствует протоколам:
BitwiseOperationsType
CVarArgType
Сопоставимые
CustomStringConvertible
Equatable
Hashable
MirrorPathType
RandomAccessIndexType
SignedIntegerType
SignedNumberType
Вы можете проверить исходный код Bool.swift, где Bool
реализован.
Ответ 4
Swift не имеет примитивных типов.
На всех языках программирования у нас есть базовые типы, которые доступны для части языка. В быстрых случаях мы используем эти типы через стандартную библиотеку Swift, созданную с использованием структур. К ним относятся типы чисел, символов и строк.
![введите описание изображения здесь]()
Ответ 5
В Swift нет примитивов.
Однако существует различие между "типами значений" и "ссылочными типами". Это не подходит для использования на С++ или Java.
Ответ 6
Они являются частичными примитивными.
Swift не подвергает примитиву, как другой язык (Java). Но Int, Int16, Float, Double определяются с использованием структуры, которая ведет себя как тип данных производных примитивов (Structure), а не указатель объекта.
Быстрая документация, благоприятная для примитивной функции:
1. У них есть расширение Hashable say
Аксиома: x == y
подразумевает x.hashValue == y.hashValue
. и hashValue - текущее назначенное значение.
2. Большинство методов init используются для проверки типов и проверки переполнения (помните, что swift является безопасным по типу).
Int.init(_ other: Float)
3. См. Ниже код Int имеет значение по умолчанию 0 с дополнительным типом. Пока NSNumber печатает нуль с необязательной переменной типа.
var myInteger:Int? = Int.init()
print(myInteger) //Optional(0)
var myNumber:NSNumber? = NSNumber.init()
print(myNumber) //nil
Swift Documentation не поддерживает примитивную функцию:
- В соответствии с документом существует два типа: именованные типы и составные типы. Нет понятия типов примитивов.
Расширение поддержки
- Int
расширение Int: Hashable {}
- Все эти типы доступны через стандартную библиотеку Swift, не похожую на стандартное ключевое слово.