变量与常量
任何Swift中的变量要么是不变的,要么是可变的。变量和常量仅仅是用来秒回持有的值的可变性,或是不可变性。(思考①)
常量 - 不可变的量
let name = "Hello Swift"
这里如果你想修改name,是无法做到的,如果你强行修改这个值,Swift在编译时会抛出一个错误。
let name = "Hello Swift"
name = "Hi Swift"
要解决这个错误,我们就需要告诉编译器,这是一个变量,使用var
关键字来取代常量关键字let
。
var name = "Hello Swift"
name = "Hi Swift"
这样就不会报错了!
很多人可能会觉得,既然let
会导致异常的发生,而var
不会,为何不都直接用var
呢?这样不就不用担心异常了么!关于这点,我的理解是这样的:很多程序在程序设计之初,设计者为自己的Class定义若干个Prop的时候,设计者就应该决定这个Class中的某些值是否是应当被外部所修改的。这样会从根本上增加代码的安全性。一般来说,不可变性优于可变性,它可以帮助开发者少犯错误,并且更容易编写代码。
基础类型
在Swift中,一个类型被声明的写法格式是:是否可变
变量名
: 数据类型
。
let count: Int = 3
let name: String = "CherryKing"
Swift也支持类型判断,可以不写具体的类型信息。编译器会根据其初始值来推断它是什么类型。
let count = 3
let name = "CherryKing"
这样系统依然会根据赋值的类型,推断出count和name的类型。
字符串
打印字符串,Swift中拼接2个String
变量用+
。
let age = "18"
let name = "CherryKing"
print(name + " is " + age)
还有另外一种方式来拼接String
print("\(name) is \(age)")
有人会纠结了,这里的age是String
类型的,如果改为Int
,会如何。既然好奇,那就试一下吧。
结果可惜的是,Swift中并不会为我们自动转换类型。这也是希望我们能够清楚的知道,自己所用的数据是什么类型,以此减少数据类型导致的错误发生。所以,这里就需要我们将Int
类型的age强制转换为String
类型了。
let age = 18
let name = "CherryKing"
print(name + " is " + String(age))
print("\(name) is \(String(age))")
再次说明,Swift语言这样设计的目的是为了避免像其他高级语言一样,因为变量可以指向任意数据类型,而发生的各种问题。ㄟ( ▔, ▔ )ㄏ 只能说,灵活有灵活的便利,死板有死板的好处。
可选类型
Swift中,总是希望变量在使用前总是已经被赋初始值的,提前用一下if做一个试验:
我们可以看到,Swift编译器告诉我们,变量pet在其初始化前就被使用了,这是不被允许的。而我们实际开发中,很多值在使用前是否被初始化,并不是我们所能决定的。这时候,我们就需要一个可以为nil
、null
或者是没有被设置值的变量。
Swift对这样可选类型的使用方法是在类型声明后面加上?
。
var pet: String?
在对pet赋值前,pet的值是nil
。
之后我们对pet进行赋值,让他不再为nil
。
var pet: String?
pet = "哈士奇"
print(pet)
这时候我们可以看到,pet的值似乎和我们想象的不太一样。结果不是"哈士奇"
,而是Optional("哈士奇")
。这里是因为"哈士奇"
被包裹在可选类型当中。如果不好理解,可以先试想一下,如果String
和String?
的输出是一样的。这样的设计才会让人苦恼吧。对于程序来说,String?
只是一个可变类型,其中是否有值,只有等到运行的时候,才会被知晓。同时,非可选类型的值是不允许赋值为nil
的。
在学习的过程中,我发现,关于Swift的Markdown,似乎有更好的表现力,于是,我决定使用playground来写文章,同时可以锻炼写注释的速度~