当前位置: 首页 > 面试题库 >

类型安全和类型推断之间有什么区别?

傅高逸
2023-03-14
问题内容

它们有何不同?我有点困惑,因为它们似乎是相似的概念。

了解它们如何帮助优化编译时间?


问题答案:

从Swift自己的文档中:

类型安全

Swift是一种类型安全的语言。类型安全的语言鼓励您清楚代码可以使用的值的类型。 如果代码的一部分需要一个String,则不能错误地将其传递给Int。

var welcomeMessage: String
welcomeMessage = 22 // this would create an error because you  
//already specified that it's going to be a String

类型推断

如果您 指定所需的值类型,则Swift会使用类型推断来得出适当的类型。通过类型推断,编译器 可以在编译代码时自动 检查 特定表达式的类型
,只需检查您提供的值即可。

var meaningOfLife = 42 // meaningOfLife is inferred to be of type Int
meaningOfLife = 55 // it Works, because 55 is an Int

一起进行类型安全和类型推断

var meaningOfLife = 42 // 'Type inference' happened here, we didn't specify that this an Int, the compiler itself found out.
meaningOfLife = 55 // it Works, because 55 is an Int
meaningOfLife = "SomeString" // Because of 'Type Safety' ability you will get an 
//error message: 'cannot assign value of type 'String' to type 'Int''

具有关联类型的协议的棘手示例:

想象以下协议

protocol Identifiable {
    associatedtype ID
    var id: ID { get set }

}

您将采用以下方式:

struct Person: Identifiable {
    typealias ID = String
    var id: String
}

但是,您也可以像这样采用它:

struct Website: Identifiable {
    var id: URL
}

您可以删除typealias。编译器仍将推断类型。

有关更多信息,请参见泛型-关联类型

由于Swift的类型推断,您实际上不需要声明具体的Int项作为IntStack定义的一部分。因为IntStack符合Container协议的所有要求,所以Swift可以简单地通过查看append(_
:)方法的item参数的类型和下标的返回类型来推断要使用的适当Item。确实,如果您从上面的代码中删除了typealias Item =
Int行,那么一切仍然有效,因为很明显应该为Item使用哪种类型。

您的代码执行的类型推断越少,编译速度就越快。因此,建议避免使用集合文字。集合获取的时间越长,其类型推断就越慢…

不错

let names = ["John", "Ali", "Jane", " Taika"]

let names : [String] = ["John", "Ali", "Jane", " Taika"]

该解决方案帮助他的编译时间从10/15秒减少到一秒钟。



 类似资料:
  • 问题内容: 您能否帮助您理解本机int类型与numpy.int32或numpy.int64类型之间的主要区别(如果有)? 问题答案: 观察差异的另一种方法是询问两种对象有什么方法。 在Ipython中,我可以使用tab complete来查看方法: 方法和属性: “经营者” 方法和属性(或属性)。一些相同,但更多的是,基本上所有的: 该方法看起来很像的。他们可以做同样的数学。 在很多方面与0d数组

  • 问题内容: 这是过去的考试问题,我想知道什么是原始类型和引用类型?对于数组,我知道引用类型是由对象或变量组成的数组,而原始类型是仅使用int或字符串创建数组的类型。(对?) 您认为您会如何回答测试中的问题并获得良好的信誉?如果没有真正直接引用原始的ARRAY类型,有没有办法做到这一点?还是您只用数组解释一下就可以了。 问题答案: 这些是Java中的原始类型: boolean byte short

  • 问题内容: 斯卡拉 在Scala中,哪里可以观察到类和类型之间的差异?为什么这种区别很重要? 在编程Scala时,它只是从语言设计的角度考虑还是具有“实际”影响? 或者是根本,以“固定边界”的类型系统(,来我的心)? 爪哇 在Java中还可以识别出上面提到的许多注意事项/差异/问题? (有关语言的介绍,请参见类型和类之间的区别?。) 问题答案: 当您说“类型”时,我将假设您主要是指静态类型。但是我

  • 问题内容: Java具有泛型,而通过提供了非常强大的编程模型。那么,和Java泛型之间有什么区别? 问题答案: 它们之间有很大的区别。在C ++中,您不必为泛型类型指定类或接口。这就是为什么您可以创建真正的泛型函数和类,而不必担心键入错误。 上面的方法添加了两个相同类型的对象,并且可以用于具有“ +”运算符的任何类型T。 在Java中,如果要在传递的对象上调用方法,则必须指定一种类型,例如: 在C

  • 问题内容: 我需要将 时间 和 日期 都存储在mysql中。所以我使用了函数。但是我不知道我应该为phpmyadmin 类型列 使用什么。应该注意的是,返回时间和日期都是这样的: 这是一个解决方案,我可以使用分隔符来分隔日期和时间(和),然后将它们分别存储在DATE类型和TIME类型中。或者,我可以使用VARCHAR类型将它们都存储在一列中。但是我认为这些方法不是标准的。存储日期和时间的标准类型是

  • 你好打字专家们, 有人可以解释为什么下面的代码在第 16 行给我一个错误,而不是在第 13 行给我一个错误。这是预期功能还是缺少功能? 密码 游乐场链接