Int,String等被认为是'原语'在斯威夫特?

时间:2016-04-24 10:51:05

标签: swift

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

摘自official documentation

  

通常在其他情况下被视为基本或原始的数据类型   语言 - 例如表示数字,字符和类型的类型   strings-实际上是命名类型,在Swift中定义和实现   使用结构的标准库。

这是否意味着以下内容:

Int
Float
String
// etc

...不被视为原语?

6 个答案:

答案 0 :(得分:24)

是,不......

正如其他答案所指出的那样,在Swift中,在语言层面之间没有任何区别被认为是"原语"在其他语言和标准库中的其他结构类型或您可以自己创建的值类型。例如,它不像Java那样,intInteger之间存在很大差异,并且不可能创建自己的类型,其行为在语义上类似于前任的。在Swift中,所有类型都是"非原始的"或者"用户级":定义Int的语法和语义的语言功能与定义CGRectUIScrollView或您自己的语法和语义没有区别类型。

然而,仍有区别。 CPU具有诸如添加整数,乘法浮点数,甚至采用向量交叉乘积之类的任务的本机指令,但不包括诸如插入rects或搜索列表之类的任务。当人们说出一些语言的类型时,人们谈论的其中一个原因是"原始的"这些是编译器为底层CPU体系结构提供挂钩的类型,因此使用这些类型执行的操作可直接映射到基本CPU指令。 (也就是说,像&#34这样的操作;添加两个整数"不要陷入对象查找和函数调用。)

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

与许多其他语言的区别在于,对于Swift来说,"原语"类型和其他是标准库的实现细节,而不是"特征"的语言。

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

当人们谈论字符串是"原语"键入多种语言,这是一个不同的含义 - 字符串是一个远离CPU的抽象级别,而不是整数和浮点数。

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

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

答案 1 :(得分:5)

Swift没有原始类型。

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

enter image description here

答案 2 :(得分: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);

输出

10
0
no value

答案 3 :(得分:2)

就像Ruby一样,Swift没有原始类型。

每个示例的Int实现为struct并符合协议:

BitwiseOperationsType
CVarArgType
可比
CustomStringConvertible
Equatable
哈希的
MirrorPathType
RandomAccessIndexType
SignedIntegerType
SignedNumberType

您可以查看Boolimplemented的Bool.swift的源代码。

答案 4 :(得分:2)

Swift中没有原语。

但是,“值类型”和“引用类型”之间存在区别。这不适合C ++或Java使用。

答案 5 :(得分:1)

他们是部分原始的。

Swift没有像其他语言(Java)那样暴露原语。但Int,Int16,Float,Double是使用结构定义的,其行为类似于派生基元数据类型(结构)而不是对象指针。

Swift文档支持原始功能:

1.他们有Hashable延伸说

Axiom: x == y隐含x.hashValue == y.hashValue。         和hashValue是当前赋值。

2.大多数init方法用于类型转换和溢出检查(记住swift类型安全)。

    Int.init(_ other: Float)

3。请参阅以下代码Int具有可选类型的默认值0。虽然NSNumber使用可选的类型变量打印nil。

 var myInteger:Int? = Int.init()
 print(myInteger) //Optional(0)
 var myNumber:NSNumber? = NSNumber.init()
 print(myNumber) //nil

Swift文档不支持原始功能:

  1. 根据doc,有两种类型:命名类型和复合类型。没有基元类型的概念。
  2. Int支持扩展 扩展Int:Hashable {}
  3. 所有这些类型都可通过Swift标准库获得,而不是标准关键字。