【问题标题】:Are Int, String etc. considered to be 'primitives' in Swift?Int、String 等在 Swift 中是否被视为“原语”?
【发布时间】:2017-08-20 00:38:55
【问题描述】:

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

摘自official documentation

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

这是否意味着以下内容:

Int
Float
String
// etc

...不被视为原语?

【问题讨论】:

    标签: swift


    【解决方案1】:

    是,不是……

    正如其他答案所指出的,在 Swift 中,在语言级别在其他语言中被视为“原始”的事物与标准库中的其他结构类型或值之间没有区别您可以自己创建的类型。例如,它不像 Java,intInteger 之间有很大的区别,并且不可能创建自己的类型在语义上表现得像前者。在 Swift 中,所有类型都是“非原始”或“用户级”:定义 Int 的语法和语义的语言特征与定义 CGRectUIScrollView 或您自己的语言特征没有什么不同类型。

    但是,还是有区别的。 CPU 具有用于诸如添加整数、乘以浮点数甚至进行向量叉积等任务的本机指令,但没有诸如插入矩形或搜索列表之类的任务。人们在“原始”地命名某些语言类型时谈论的一件事是,这些类型是编译器为底层 CPU 架构提供挂钩的类型,因此您对这些类型所做的事情直接映射到基本 CPU指示。 (也就是说,像“添加两个整数”这样的操作不会在对象查找和函数调用中陷入困境。)

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

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


    只是在这个问题上再啰嗦一下......

    当人们在许多语言中谈论字符串是“原始”类型时,这个词的含义就不同了——字符串是比整数和浮点数更远离 CPU 的抽象层次。

    字符串在其他语言中是“原始的”通常意味着它在 C 或 Java 中所做的事情:编译器有一种特殊情况,将某些内容放在引号中会导致一些数据被构建到程序二进制文件中,并且在代码中的位置您在其中编写了获取指向该数据的指针,可能包含在某种对象接口中,因此您可以使用它进行有用的文本处理。 (即字符串文字。)也许编译器也有特殊情况,因此您可以为其中一些文本处理过程提供方便的快捷方式,例如用于连接的+

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

    【讨论】:

    • 但是如果Int 在标准库中实现,它无论如何都必须依赖一些“原语”。那些原语是什么?如果我想实现我自己的Int 怎么办?例如,我将如何表示一个原始的 32 位数字?
    • 回头看看答案:“而在 Swift 中,编译器不提供任何其他方式来直接访问这些操作。” 如果您查看 @987654321 @ 对于标准库,您会看到许多“原始”类型通过 Builtin 命名空间连接到编译器本身的钩子。这种东西是我在这个答案中谈到的基本 CPU 指令的第 1 步,而 IIRC Swift 编译器不会使其可用于标准库之外的代码。
    【解决方案2】:

    Swift 没有原始类型。

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

    【讨论】:

      【解决方案3】:

      不,它们不是其他语言定义原语的原语。但是它们的行为就像原语一样,因为它们是按值传递的。这是因为它们是由结构内部实现的。考虑:

      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
      

      【讨论】:

        【解决方案4】:

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

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

        BitwiseOperationsType
        CVarArgType
        比较
        CustomStringConvertible
        平等的
        可散列
        镜像路径类型
        RandomAccessIndexType
        有符号整数类型
        签名号码类型

        您可以查看 Bool.swift 的源代码,其中Boolimplemented

        【讨论】:

          【解决方案5】:

          Swift 中没有原语。

          但是,“值类型”和“引用类型”是有区别的。这不太适合 C++ 或 Java 的使用。

          【讨论】:

            【解决方案6】:

            它们是部分原始的。

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

            支持原始特性的 Swift 文档:

            1.他们有Hashable扩展说

            公理: 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. 根据文档,有两种类型:命名类型和复合类型。没有基元类型的概念。
            2. int 支持扩展 扩展 Int : 可散列 {}
            3. 所有这些类型都可以通过 Swift 标准库获得,不像标准关键字。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-08-01
              • 1970-01-01
              • 2017-03-19
              • 1970-01-01
              • 2020-07-18
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多