为什么我需要在Swift中指定变量在类中的类型?

时间:2014-06-03 03:19:05

标签: ios swift

我只是想知道。据我了解,varlet可以是任何内容,Swift可以像JavaScript一样自动执行正确的类型。但是当我尝试在类中设置属性时,当我没有指定类型时会出现错误。

var value1, value2 // Error: missing annotations

好吧,我已经阅读了一些引用,变量需要类似于var foo = 0的声明类型。但是在我的班上我有一个init(),它会将变量设置为我在创建类对象时输入的内容。

那我该怎么做呢?它甚至可能吗?

我看到了类型typealias,但这也没有用。

3 个答案:

答案 0 :(得分:10)

虽然Swift和Javascript都允许您在不定义类型的情况下将常量分配给变量,但这两种语言存在根本区别。 Swift是一种强类型,类型安全的语言,而Javascript则不是。来自 Swift编程语言 -

  

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

     

摘自:Apple Inc.“The Swift Programming Language。”iBooks。   https://itunes.apple.com/au/book/swift-programming-language/id881256329?mt=11

所以当你说

var welcomeMessage = "Hello" 

Swift推断您希望welcomeMessage成为字符串并相应地设置其类型。随后尝试

welcomeMessage=3

将导致运行编译时错误,因为您分配的类型不正确。

如果您没有指定初始值,那么Swift无法推断出类型,您必须指定它。

另一方面,Javascript非常乐意接受

var welcomeMessage="Hello"
welcomeMessage=3

因为它不是类型安全的,只是尝试用它拥有的值尽力而为。例如,如果在为welcomeMessage分配3之后对welcomeMessage执行字符串操作,则Javascript会将该值转换为“3”,然后执行该操作。

虽然有Javascript的类型安全扩展,但它不是Swift的基本部分语言

答案 1 :(得分:7)

仅在最初指定默认值时才推断类型。从语言参考中的示例中,声明类型:

var welcomeMessage: String

或指定一个允许Swift推断类型的初始值:

welcomeMessage = "Hello"
  

在上面的welcomeMessage示例中,没有提供初始值,因此使用类型注释指定了welcomeMessage变量的类型,而不是从初始值推断出来。

答案 2 :(得分:3)

JavaScript 动态类型,意味着变量没有分配类型。类型仅与对象相关联。所以变量可以包含任何类型的对象。

另一方面,Swift 静态键入。含义变量具有类型。您不能将任何对象放入变量中。编译器将确保您只将兼容对象放入变量中。

Swift具有类型推断,允许编译器在写入时找出类型:

var value1 = "foobar"

但只是编写var value1不会让编译器弄清楚value1变量的类型。 JavaScript没有这个问题,因为变量没有类型。

请记住,类似的语法并不意味着相同的语义。 Swift可能看起来有点像JavaScript语法,但关键字的含义(语义)却截然不同。如果你想模拟JavaScript:

var value1, value2

在Swift中你会写:

var value1: AnyObject
var value2: AnyObject

这样您就可以将任何对象放入value1value2变量中。