Int,String等被认为是Swift中的"原始"吗?

Swi*_*ter 21 swift

表示使用swift中的结构实现的数字,字符和字符串的类型.

摘自官方文件:

通常在其他语言中被认为是基本或原始的数据类型(例如表示数字,字符和字符串的类型)实际上是命名类型,使用结构在Swift标准库中定义和实现.

这是否意味着以下内容:

Int
Float
String
// etc
Run Code Online (Sandbox Code Playgroud)

......不被视为原始人?

ric*_*ter 26

是的,不是......

正如其他答案所指出的那样,在Swift中,在其他语言中被认为是"原语"的东西与标准库中的其他结构类型或您自己可以创建的值类型之间的语言级别没有区别.例如,它不像Java那样,和之间存在很大差异,int并且Integer不可能创建自己的类型,其行为与前者类似.在斯威夫特,所有类型为"非基本"或"用户级":定义的语法和,比如语义的语言特性,Int并没有什么不同,从那些定义CGRectUIScrollView或自己的类型.

但是,仍有一个区别.CPU具有诸如添加整数,乘以浮点数,甚至采用向量交叉乘积之类的任务的本机指令,但不包括诸如插入rects或搜索列表之类的任务.人们在"原始地"命名一些语言类型时所讨论的事情之一就是那些是编译器为底层CPU架构提供挂钩的类型,因此使用这些类型执行的操作直接映射到基本CPU说明.(也就是说,"添加两个整数"之类的操作不会陷入对象查找和函数调用中.)

Swift仍然具有这种区别 - 某些标准库类型IntFloat特殊之处在于它们映射到基本的CPU操作.(在Swift中,编译器不提供任何其他方法来直接访问这些操作.)

与许多其他语言的区别在于,对于Swift,"原始"类型之间的区别是标准库的实现细节,而不是语言的"特征".


只是为了更多地讨论这个问题......

当人们谈论字符串在许多语言中是一种"原始"类型时,这是一个不同的含义 - 字符串是一个远离CPU的抽象级别,而不是整数和浮点数.

字符串在其他语言中是"原始的"通常意味着它在C或Java中的作用:编译器有一个特殊的情况,在引号中放入一些内容会导致一些数据内置到程序二进制文件中,以及代码中你写的地方获取指向该数据的指针,可能包含在某种对象接口中,以便您可以使用它进行有用的文本处理.(也就是说,字符串文字.)也许编译器也有特殊情况,以便您可以为某些文本处理过程(如+连接)提供方便的快捷方式.

在Swift String中,它是"原始的",因为它是标准库中所有与文本相关的函数使用的标准字符串类型.但是没有编译器魔法阻止你制作自己的字符串类型,可以使用文字创建或使用运算符处理.再说一遍,Swift中"原语"和用户类型之间的差异要小得多.


Dav*_*eek 6

Swift没有原始类型.

在所有编程语言中,我们都有基本类型,这些类型是语言的一部分.在swift中,我们通过使用结构创建的Swift标准库获得了这些类型.这些包括数字,字符和字符串的类型.

在此输入图像描述


Evd*_*afa 5

不,在其他语言定义原语的意义上,它们不是原始的.但是他们的行为就像原始人一样,在某种意义上说,他们是通过价值来传递的.这是因为它们是由结构内部实现的.考虑:

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);
Run Code Online (Sandbox Code Playgroud)

输出是

10
0
no value
Run Code Online (Sandbox Code Playgroud)