一、数据
Swift 是类型安全的语言:
- Swift 必须明确数据类型
- 如果取值错误会直接报错
- Swift 会进行溢出检查 (OC 也会检查)
- Swift 没有隐式类型转换, 不允许不同类型的数据类型进行运算
1.1 简单使用
Swift 很接近脚本语言,尤其是在数据类型方面。定义数据类型只允许使用 let 与 var,let 标识的是常量, var 标识的是变量。那么问题来了:那应该如何使用?在 Swift 中有可变类型么?
let name = "CoderHG"
print(name)
上面简单的定义了一个 name,如果没有看到后面具体的值,根本就不知道 name 是一个字符串类型。但是打断点查看,name 就是一个 String 类型的数据。将上面的代码中的 let 换成 var,会发现在上面的使用上没有任何的区别, 能正常使用。
var name = "CoderHG"
print(name)
但是还是有区别的,上面已经介绍 let 标识的是常量, var 标识的是变量。尽然是变量,可否将一个数字类型的 2 赋值给 name 呢?答案肯定是不可以的。在 Swift 中的定义,必须在定义的那一刻就要决定其数据类型。所以下面的这种定义是错误的:
var name
print(name)
这样的话,Xcode 是会直接报错的,因为在定义的时候没有指明 name 是什么类型。那么问题又来了,如何定义一个字符串,而又不希望有初始值呢?
var name: String
name = "CoderHG"
print(name)
这样,name 就是一个字符串类型的了。那么又出先了一个新问题,我可否这样定义:
let name: String
name = "CoderHG"
print(name)
使用 OC 的套路来思考上面的代码,肯定是不行的,因为一个常量只可能在定义的那一刻赋值,以后都是能读取其值,即为 只读。但是在 Swift 中有点不一样,Swift 在意的是第一次赋值,而不是定义时。所以上面的代码是没有问题的,但是如果再次给 name 赋值,那么肯定就出错了。
接下来主要介绍一下:在 Swift 中的可变类型。,在 OC 中一般使用 NSMutable¥ 来表示一个可变类型,那么在 Swift 中如何表示呢?其实 var 不仅代表一个变量,也代表着 OC 中的可变性。比如,可以这么使用:
var name = "CoderHG"
name.append(", Very GOOD!")
print(name)
如果换成 let 肯定是不行的。
上面简单的介绍了一下 let 与 var 的简单用法与注意事项。
看到这里,是否会不由自主的想到 OC 中这样的代码:
id obj = [[NSObject alloc] init];
obj = [[HGPerson alloc] init];
然后 Swift 中也来了这么一段:
var obj = NSObject()
// var obj:HGPerson = NSObject() as! HGPerson
print(obj)
obj = HGPerson()
print(obj)
以上两段代码说明在 Swift 中的 var 也有 OC 中 id 的影子,所以在 Swift 中做类型检测也是很有必要的。所以在 Swift 中会经常看类似这样的代码:
var obj = NSObject()
print(obj)
obj = HGPerson()
print(obj)
let person = obj as! HGPerson
print(person)
在上面用到了一个类型转换的标识 as!,在 Swift 中的全部类型转换标识,如下:
is : 用于判断一个实例是否是某一种类型
as : 将实例转成某一种类型 (比如子类->父类转换)
as?:将某个类型转成可选类型,通过判断可选类型是否有值,来决定是否转化成功
as!: 将某个类型转成具体的类型,但是注意:如果不是该类型,那么程序会崩溃
1.2 数据类型
在 OC 中的数据类型主要分成两种:基本数据类型与对象类型,在 Swift 中也一样。但是在 Swift 中最为常见的是 结构体(基本数据类型),比如 String 与 Int8:
public struct String
public struct Int8 : FixedWidthInteger, SignedInteger
在 OC 中字符串是对象类型,数字是基本数据类型(NSNumber 除外)。当然这些结构体类型的数据,都是可以无缝衔接到对象类型,比如 NSString,一般使用 String 就能满足很多的场景。
1.3 可选与非可选数据类型
在 Swift 中,一个变量没有 默认值 这种说法。一个变量要么是有值、要么没有值,这就叫做 可选类型。Swift