我只是想知道。据我了解,var
和let
可以是任何内容,Swift
可以像JavaScript
一样自动执行正确的类型。但是当我尝试在类中设置属性时,当我没有指定类型时会出现错误。
var value1, value2 // Error: missing annotations
好吧,我已经阅读了一些引用,变量需要类似于var foo = 0
的声明类型。但是在我的班上我有一个init()
,它会将变量设置为我在创建类对象时输入的内容。
那我该怎么做呢?它甚至可能吗?
我看到了类型typealias
,但这也没有用。
答案 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
这样您就可以将任何对象放入value1
和value2
变量中。