表示使用swift中的结构实现的数字,字符和字符串的类型。
通常在其他情况下被视为基本或原始的数据类型 语言 - 例如表示数字,字符和类型的类型 strings-实际上是命名类型,在Swift中定义和实现 使用结构的标准库。
这是否意味着以下内容:
Int
Float
String
// etc
...不被视为原语?
答案 0 :(得分:24)
是,不......
正如其他答案所指出的那样,在Swift中,在语言层面之间没有任何区别被认为是"原语"在其他语言和标准库中的其他结构类型或您可以自己创建的值类型。例如,它不像Java那样,int
和Integer
之间存在很大差异,并且不可能创建自己的类型,其行为在语义上类似于前任的。在Swift中,所有类型都是"非原始的"或者"用户级":定义Int
的语法和语义的语言功能与定义CGRect
或UIScrollView
或您自己的语法和语义没有区别类型。
然而,仍有区别。 CPU具有诸如添加整数,乘法浮点数,甚至采用向量交叉乘积之类的任务的本机指令,但不包括诸如插入rects或搜索列表之类的任务。当人们说出一些语言的类型时,人们谈论的其中一个原因是"原始的"这些是编译器为底层CPU体系结构提供挂钩的类型,因此使用这些类型执行的操作可直接映射到基本CPU指令。 (也就是说,像&#34这样的操作;添加两个整数"不要陷入对象查找和函数调用。)
Swift仍然具有这种区别 - 某些标准库类型(如Int
和Float
)的特殊之处在于它们映射到基本的CPU操作。 (在Swift中,编译器没有提供任何其他方法来直接访问这些操作。)
与许多其他语言的区别在于,对于Swift来说,"原语"类型和其他是标准库的实现细节,而不是"特征"的语言。
只是为了更多地讨论这个话题......
当人们谈论字符串是"原语"键入多种语言,这是一个不同的含义 - 字符串是一个远离CPU的抽象级别,而不是整数和浮点数。
字符串是"原始"在其他语言中通常意味着它在C或Java中的作用:编译器有一个特殊的情况,在引号中放入一些内容会导致一些数据内置到程序二进制文件中,以及代码中你写入的地方获取指针该数据,可能包含在某种对象接口中,因此您可以使用它进行有用的文本处理。 (也就是说,字符串文字。)也许编译器也有特殊情况,以便您可以为某些文本处理过程(例如+
)提供便捷的快捷方式以进行连接。
在Swift中,String
是"原始"因为它是标准库中所有文本相关函数使用的标准字符串类型。但是没有编译器魔法阻止你制作自己的字符串类型,可以使用文字创建或使用运算符处理。再说一次,"原语"之间的差别要小得多。和Swift中的用户类型。
答案 1 :(得分:5)
答案 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
您可以查看Bool
为implemented的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文档不支持原始功能: