基础部分

作者: 黄祯鑫 | 来源:发表于2020-08-25 10:58 被阅读0次

本章内容学习自官方文档 https://swiftgg.gitbook.io/swift/swift-jiao-cheng/01_the_basics

一、基本类型

Swift 包含了 C 和 Objective-C 上所有基础数据类型,Int 表示整型值; DoubleFloat 表示浮点型值; Bool 是布尔型值;String 是文本型数据。
Swift 还提供了三个基本的集合类型,ArraySetDictionary ,详见 集合类型

二、高级类型

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赋值,类型推断会自动执行对应的行为。

七、错误处理、断言

官方文档
错误处理
断言

相关文章

  • 基础部分

    Swift 是一门开发 iOS, macOS, watchOS 和 tvOS 应用的新语言。然而,如果你有 C 或...

  • 基础部分

    坐标系 D3通过SVG画图,SVG的坐标系同HTML中的坐标系类似,都是以左上角作为坐标原点,向下向右为正延伸。 ...

  • 基础部分

    1、基础的数据类型 集合类型:Array、Set 和 Dictionary数据类型:Int(整型值)、Double...

  • 基础部分

    本章内容学习自官方文档 https://swiftgg.gitbook.io/swift/swift-jiao-c...

  • python基础部分

    C、C++、C#、Java、php、python语言的内在特性及区别 参考:https://blog.csdn.n...

  • 基础部分(1)

    1.Java基本数据类型 四种整数类型(byte、short、int、long) 两种浮点数类型(float、do...

  • JSON基础部分

    1.格式 格式: "key":value 2.两个方法 2.1 parse:把字符串转换成JSON ps:" ' ...

  • Swift: 基础部分

    Swift中文文档 一、常量和变量 常量: 不可变的量, 使用 let 修饰 变量: 可以修改值的量, 使用 va...

  • JS基础部分

    把元素移除视线的办法 属性操作 元素.属性innerHTML通过元素.属性修改的是行内属性;修改className...

  • Java基础部分

    写在前面:www.jianshu.com/p/e17ab3849031 java基础——概述与准备工作:www.j...

网友评论

    本文标题:基础部分

    本文链接:https://www.haomeiwen.com/subject/epwojktx.html