本章内容学习自官方文档 https://swiftgg.gitbook.io/swift/swift-jiao-cheng/01_the_basics
一、基本类型
Swift 包含了 C 和 Objective-C 上所有基础数据类型,
Int
表示整型值;Double
和Float
表示浮点型值;Bool
是布尔型值;String
是文本型数据。
Swift 还提供了三个基本的集合类型,Array
、Set
和Dictionary
,详见 集合类型。
二、高级类型
Swift 还增加了 Objective-C 中没有的高阶数据类型比如元组(Tuple)。元组可以让你创建或者传递一组数据,比如作为函数的返回值时,你可以用一个元组可以返回多个值。
Swift 还增加了可选(Optional)类型,用于处理值缺失的情况。可选表示 “那儿有一个值,并且它等于 x ” 或者 “那儿没有值” 。可选有点像在 Objective-C 中使用 nil ,但是它可以用在任何类型上,不仅仅是类。可选类型比 Objective-C 中的 nil 指针更加安全也更具表现力,它是 Swift 许多强大特性的重要组成部分。
Swift 是一门类型安全的语言,这意味着 Swift 可以让你清楚地知道值的类型。类型安全可以帮助你在开发阶段尽早发现并修正错误。
NSString *str = @1;
NSLog(@"%d", str.length);
OC 中可以编译通过,但在运行时才会检查 str 的类型, 为 NSNumber 对象,调用 length 方法会崩溃
var str: String = 1
Swift 中编译不能通过,编译时检查 str 的类型,如上所述,开发阶段即可
三、常量、变量
常量和变量必须在使用前声明,用 let 来声明常量,用 var 来声明变量。
let string = "string"
var mutableString = "mutableString"
OC 中为保证安全经常需要使用copy
修饰拥有可变类型的对象,而由于swift 是类型安全的,所以只需对可变类型使用 var 声明即可。OC 中常量经常定义在类的外部,其他类中使用时需要import
相应的.h 文件,还有一点是常量初始化时必须用常量赋值,如NSString
CGFloat
等,无法使用对象赋值,因为对象只有运行时才能确定类型,而我们定义的常量是在编译时就需要确定类型的。
extern NSString * const kSomeString; //.h文件
NSString *const kSomeString = @"someString";//.m文件
再对比下定义一个字体常量在 OC 和 Swift 中分别如何实现
NSInteger * const kBigFontSize = 20;
UIFont *bigFont = [UIFont systemFontOfSize: kBigFontSize]; //OC
let BIG_FONT = UIFont.systemFont(ofSize: 20)
let bigFont = BIG_FONT //Swift
OC 中,类的成员变量可以通过设置readonly
防止通过 set
方法修改成员变量的值,但是仍然可以通过_
直接修改或 KVC
的方式修改,在 Swift 中类的属性可以是变量或常量
class Person {
let name = "Bob"
var age = 13
}
let person = Person()
person.name = "Tim" //编译器报错Cannot assign to property: 'name' is a 'let' constant
person.age = 100
四、类型安全和类型推断
官方文档类型安全和类型推断
因为有类型推断,和 C 或者 Objective-C 比起来 Swift 很少需要声明类型。常量和变量虽然需要明确类型,但是大部分工作并不需要你自己来完成。
当你声明常量或者变量并赋初值的时候类型推断非常有用。当你在声明常量或者变量的时候赋给它们一个字面量(literal value 或 literal)即可触发类型推断。
五、元组
个人理解Swift 中的元组与 Python 中的元组类似
官方文档元组
当遇到一些相关值的简单分组时,元组是很有用的。元组不适合用来创建复杂的数据结构。如果你的数据结构比较复杂,不要使用元组,用类或结构体去建模。
六、可选类型
官方文档可选类型
C 和 Objective-C 中并没有可选类型这个概念。最接近的是 Objective-C 中的一个特性,一个方法要不返回一个对象要不返回 nil,nil 表示“缺少一个合法的对象”。然而,这只对对象起作用——对于结构体,基本的 C 类型或者枚举类型不起作用。对于这些类型,Objective-C 方法一般会返回一个特殊值(比如 NSNotFound)来暗示值缺失。这种方法假设方法的调用者知道并记得对特殊值进行判断。然而,Swift 的可选类型可以让你暗示任意类型的值缺失,并不需要一个特殊值。
Swift 的 nil 和 Objective-C 中的 nil 并不一样。在 Objective-C 中,nil 是一个指向不存在对象的指针。在 Swift 中,nil 不是指针——它是一个确定的值,用来表示值缺失。任何类型的可选状态都可以被设置为 nil,不只是对象类型。
强制解析
当你确定可选类型确实包含值之后,你可以在可选的名字后面加一个感叹号(!)来获取值。这个惊叹号表示“我知道这个可选有值,请使用它。”这被称为可选值的强制解析(forced unwrapping)
隐式解析可选类型
let possibleString: String? = "An optional string." //`?`表示可选类型
let forcedString: String = possibleString! // forcedString是指定类型`String`,不使用`!`直接赋值编译器会报错,因为possibleString是可选类型,返回值可能为 nil,forcedString为指定类型,必须要有值, 需要感叹号隐式解析来获取值
print(type(of: forcedString)) 结果:Optional<String>
print(type(of: forcedString)) 结果:String
forcedString是指定类型String
,不使用!
直接赋值编译器会报错,因为possibleString是可选类型,返回值可能为 nil,forcedString为指定类型,必须要有值, 需要感叹号 强制解析 来获取值。
let assumedString: String! = "An implicitly unwrapped optional string."
let implicitString: String = assumedString // implicitString为显式String类型,assumedString会隐式解析
let optionalString = assumedString //optionalString 没有显式的数据类型,根据类型推断,为可选类型。
可选类型可以通过 if 语句来判断是否有值,如果有值的话可以通过可选绑定来解析值。
隐式解析的好处是不必每次使用可选类型时都做解析,当确定可选类型第一次被赋值后总会有值,可以使用隐式解析,在定义时直接将!
放在可选类型后面,如上面的assumedString
,无论是显式类型还是可选类型的变量或者常量,都可以直接使用assumedString
赋值,类型推断会自动执行对应的行为。
网友评论