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

发布于 2021-01-31 23:35:43

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

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

关注者
0
被浏览
106
1 个回答
  • 面试哥
    面试哥 2021-01-31
    为面试而生,有面试问题,就找面试哥。

    从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秒减少到一秒钟。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看