Swift

Swift001-数据类型 元组 枚举 结构体

2019-07-10  本文已影响0人  DDY

Swift001-数据类型 元组 枚举 结构体

Swift 包含了 Objective-C 上所有基本数据类型,另外还增加了高阶数据类型,如元组(Tuple),还增加了可选类型(Optional)

变量与常量声明方式

整型

浮点型

布尔型

字符型

字符串

数组

字典

集合

结构体

枚举

与OC只能整型不同,Swift支持更多枚举方案:

可选类型

元组

目前Swift中唯一的一种复合类型,他可以将指定有限个数的任何类型一次整理为一个对象,元组中的每一种类型都可以是任何的结构体、枚举或类类型,甚至也可以是一个元组以及空元组。元组中的每个元素我们称为一个“分量”,一般以”元素“统称

用例

/// 元组用例
    public class func testBasic() {
        // 给元组元素加标签(不能数字开头),可通过标签或索引下标来访问元素
        let tupleTest1 = (gameName:"game", age:18, _:99, 10086, s0090990s:"666")
        let tupleSub0 = tupleTest1.gameName
        let tupleSub1 = tupleTest1.0
        // 声明一个类型为(Int, Double, Bool)的元组常量,通过索引访问元素(索引下标从0开始)
        let tupleTest2 = (10, 0.5, false)
        let tupleSub2 = tupleTest2.0
        print("\(tupleTest1)") // (gameName: "game", age: 18, 99, 10086, s0090990s: "666")
        print("\(tupleSub0)") // game
        print("\(tupleSub1)") // game
        print("\(tupleTest2)") // (10, 0.5, false)
        print("\(tupleSub2)") // 10
        // 一旦一个元组的某个元素带上标签,那么该元组类型相应的位置上也必须加上标签
        // 一个元组中不需要给所有的元素都加上标签,可以加一部分,指定标签的元素
        // 如果给定标签,我们可以通过标签访问也可以通过索引位置访问
        // 元组往往用于一个函数返回多个不同类型的对象的场合
    }

萃取元素

/// 元组萃取元素
    public class func testGetElement() {
        // 声明一个元组常量tupleTest, 元组也可以看作一个对象
        let tupleTest = (10, 0.5, true)
        // 这里同时声明三个常量:a, b, c tupleTest的第一个元素对 a 初始化,b, c同理
        // let (a, b, c) 不是在声明元组,而是同时声明三个常量,用于萃取一个元组中的值
        let (a1, b1, c1) = tupleTest
        // 如果我们不想萃取元组中的某个元素,用_代替
        let (a2, _, c2) = (5.5, "hello", false)
        // 因为元组分解这一语法特性,可以通过元组字面量来交换两个对象的值
        var a3 = 1, b3 = 2
        // 交换两个对象的值,a3 = 2, b3 = 1
        (a3, b3) = (b3, a3)
        // a1:10 b1:0.5 c1:true a2:5.5 c2:false a3:2 b31
        print("a1:\(a1) b1:\(b1) c1:\(c1) a2:\(a2) c2:\(c2) a3:\(a3) b3\(b3)")
    }

元组比较

/// 元组比较
    public class func testCompara() {
        let tupleCompare1 = (1, 2, 3)
        let tupleCompare2 = (1, 2, 3)
        let tupleCompare3 = (6, 9, 3, 4)
        let tupleCompare4 = (6, 2, 5, 8)
        let tupleCompare5 = (true, 9, 3, 4)
        let tupleCompare6 = (false, 2, 5, 8)
        // 判断元组 t1和t2 是否相等,结果为:t1 == t2? true
        print("t1 == t2? \(tupleCompare1 == tupleCompare2)")
        // 判断元组 t3和t4 是否为小于关系,结果为:t3 < t4? false 因为t3的第二个元素大于t4的第二个元素
        print("t3 < t4? \(tupleCompare3 < tupleCompare4)")
        // 这里t1和t3比较,会直接报错,因为不属于同一个类型
        // print("tupleCompare1 = tupleCompare3? \(tupleCompare1 == tupleCompare3)")
        // 这里的tupleCompare5和tupleCompare6比较也会报错,虽然元组类型一样,因为Bool类型不遵循comparable协议
        // print("t5 < t6? \(tupleCompare5 < tupleCompare6)")
    }

注意: 一旦一个元组的某个元素带上标签,那么该元组类型相应的位置上也必须加上标签,一个元组中不需要给所有的元素都加上标签,可以加一部分,指定标签的元素,我们可以通过索引位置访问也可以通过标签访问; 元组往往用于一个函数返回多个不同类型的对象的场合。

我们能很容易的定义一个元组对象,我们也可以很容易的同时萃取一个元组中的相应元素,这也被称为元组分解

// 声明一个元组常量tuple
let tuple = (10, 0.5, true)
// 这里同时声明三个常量:a, b, c
// tuple的第一个元素对 a 初始化,b, c同理
let (a1, b1, c1) = tuple
// 上面代码 let (a, b, c) 不是在声明元组,而是同时声明三个常量,用于萃取一个元组中的值,元组也可以看作一个对象,上面的tuple就是名副其实的一个元组对象
// 如果我们不想萃取元组中的某个元素,用_代替
// a的值为:5.5, c的值为:false
let(a2, _, c2) = (5.5, "hello", false)

// 因为元组分解这一语法特性,可以通过元组字面量来交换两个对象的值
// 定义 a和b两个Int类型对象
var a3 = 1, b3 = 2
// 交换两个对象的值,一个特殊用法,不用引入中间变量
(a3, b3) = (b3, a3) 
print("\(a1) \(b1) \(c1) \(a2) \(c2) \(a3) \(b3)")
// 10 0.5 true 5.5 false 2 1

元组比较

let tupleCompare1 = (1, 2, 3)
let tupleCompare2 = (1, 2, 3)
let tupleCompare3 = (6, 9, 3, 4)
let tupleCompare4 = (6, 2, 5, 8)
let tupleCompare5 = (true, 9, 3, 4)
let tupleCompare6 = (false, 2, 5, 8)
// 判断元组 t1和t2 是否相等,结果为:true
print("t1 == t2? \(tupleCompare1 == tupleCompare2)")
// 判断元组 t3和t4 是否为小于关系,结果为:false 因为t3的第二个元素大于t4的第二个元素
print("t3 < t4? \(tupleCompare3 < tupleCompare4)")
// 这里t1和t3比较,会直接报错,因为不属于同一个类型
// print("tupleCompare1 = tupleCompare3? \(tupleCompare1 == tupleCompare3)")
// 这里的tupleCompare5和tupleCompare6比较也会报错,虽然元组类型一样,因为Bool类型不遵循comparable协议
// print("t5 < t6? \(tupleCompare5 < tupleCompare6)")

简单使用

// 写法一:
let error = (404, "Not Found")
//下标访问
print(error.0)
print(error.1)

// 写法二:
let error = (errorCode : 404, errorInfo : "Not Found")
//别名访问
print(error.errorCode)
print(error.errorInfo)

// 写法三:
//定义元组变量接收元素的值
let (errorCode, errorInfo) = (404, "Not Found")
print(errorCode)
print(errorInfo)

Any、AnyObject

Any是一个空协议集合的别名,它表示没有实现任何协议,因此它可以是任何类型,包括类实例与结构体实例。可以表示任何类型,包括函数类型。
AnyObject是一个成员为空的协议,任何对象都实现了这个协议。可以表示任何类类型的实例。

类型转化符号

is : 使用类型检查操作符 ( is )来检查一个实例是否属于一个特定的子类。如果实例是该子类类型,类型检查操作符返回 true ,否则返回 false 。

as : 类型转换操作符
as 从派生类转换为基类,向上转型(upcasts)
as! 向下转型(Downcasting)时使用。由于是强制类型转换,如果转换失败会报 runtime 运行错误。
as? 和 as! 操作符的转换规则完全一样。但 as? 如果转换不成功的时候便会返回一个 nil 对象。成功的话返回可选类型值。由于 as? 在转换失败的时候也不会出现错误,所以对于如果能确保100%会成功的转换则可使用 as!,否则使用 as?
.

Swift是强类型的语言,强类型语言也称为强类型定义语言,是一种总是强制类型定义的语言,要求变量的使用要严格符合定义,所有变量都必须先定义后使用
Swift中任何一个变量/常量都有明确的类型
注意:

如果定义一个标识符时有直接进行赋值,那么标识符后面的类型可以省略
Swift有类型推导,会自动根据后面的赋值来决定前面的标识符的数据类型
可以通过option+鼠标左键来查看变量的数据类型





下一页 Swift2-运算符和流程控制语句

上一篇 下一篇

猜你喜欢

热点阅读