MY_Swift_元组(tuples)最佳代码实战

来源:互联网 发布:一句话木马 php提权 编辑:程序博客网 时间:2024/05/20 03:48

本文将提供最全面的元组实践,有大量代码供你参考!

元组的玩法,你学全了吗

既然元组这么有意思,它的各种用法我们也要学一学。

  • 首先是元组的定义

0元的元组,虽然没有实际作用,但是语法上确实支持

var t0 : () = ()等同于 var t0 : (Void) = ()可以缺省类型 var t0 = ()

1元的元组,会被编译器优化为其实际元素的类型。举例:

var t1 : (String) = ("我是字符串") 等同于  var t1 : String = "我是字符串" 可以缺省类型  var t1 = "我是字符串"注意!!!由于t1实际为String类型,因此t1.0的访问会报错

多元的元组的定义

var t2 : (String, Int) = ("李刚",34)`也可以缺省类型  var t2 = ("李刚",34)`元组也支持可选类型  var t2 : (String?, Int) = (nil,34)`

元组还支持元素命名

var t2 : (name:String, age:Int) = (name:"李刚",age:34)赋值时可以省略命名  var t2 : (name:String, age:Int) = ("李刚",34)定义类型可以整个缺省,赋值时添加 var t2 = (name:"李刚",age:34)注意!!!如果定义的类型中没有命名,赋值的命名是无效的var t2 : (String, Int) = (name:"李刚",age:34)  此时访问t2.name会报错

元组支持嵌套

var t_t : (String, (String, Int)) = ("基本信息", ("李刚",34))

可以将元组的类型重定义为一个类型名

typealias namedFishesType = (first:String, second:String, third:String)let namedFishes: namedFishesType = ("cod", "dab", "eel")
  • 接下来,元组的数据访问

当元素未命名时,采用自然顺序访问,序号从0开始

例如 var t2 = ("李刚",34)name = t2.0age = t2.1

当元素命名时,可以用命名访问数据,当然仍可以使用序号进行访问

例如 var t2 = (name:"李刚",34)仍然可以用序号访问  name = t2.0也可以用命名访问  name = t2.name

可以用多个变量同时进行访问

例如 var t2 = (name:"李刚",34)var (name, age) = t2 即可同时获取name,agevar (name, _) = t2 不需要的参数可以缺省

另外注意,元组为数值类型,因此元组的拷贝是值拷贝

例如 var t2 = (name:"李刚",34)var t2_copy = t2t2.name = "王帅"print(t2_copy.name)  //输出为 李刚

关于元组的访问级别

元组的访问级别取决于它包含的元素,比如元组里的元素都是private级别的,那么该元组也是private级别的。
遵循最小的原则,也就是说如果一个元组中有两个元素,一个为private级别,另一个为public级别,那么该元组遵循最小原则,它的访问级别为private。

  • 元组的数据修改

虽然元组的数据不能增删,但是修改还是可以的

var t2 = (name:"李刚",34)t2.name = "王帅"t2 = ("李教授", 45)

但是数据类型不能改变

t2.name = 11 //报错!!!

如果是常量定义,元组的数据不能改变

let t3 = (name:"李一",24)t3.name = "李二狗"  //报错!!!

当然,如果指定数据类型为Any,这种情况下数据可以改变类型

var t_any : (String, Any) = ("李一", 24)t_any.1 = "可以改为String"   //Any不限定数据类型
  • 元组与Array、Dictionary的组合定义

数组嵌套元组

var moneyArray:[(Int,String)] = [(10,"Penny"), (15,"Nickle"), (3,"Quarter")]

字典嵌套元组

var userInfoDic:[String, (Int,String)] = ["peny":(10,"girl"), "nakl":(15,"boy")]
  • 元组的常见使用场景

非常适用于Dictionary遍历

//官方文档上的例子var airports: [String: String] = ["YYZ": "Toronto Pearson", "DUB": "Dublin"]//遍历airportsfor (airportCode, airportName) in airports {  print("\(airportCode): \(airportName)")}

非常适合用于Array的enumerate()

//官方文档上的例子var shoppingList = ["Eggs", "Milk"]for (index, value) in shoppingList.enumerate() {  print("Item \(index + 1): \(value)")}

适合函数返回多元数据

func userInfo() ->(String, Int) {  return ("李刚", Int)}

函数也可以返回可选元组,即可以返回nil

func userInfo() ->(String, Int)? {  return nil}

当然也可以部分元素为可选

func userInfo() ->(String?, Int) {  return (nil, 34)}

甚至可以用来给函数传递多元参数

//定义一个函数,有number和text两个参数func doSomething(number: Int, text: String) {  println("\(number): \(text)")}//正常调用方式doSomething(1, "one")//元组调用方式let var tupleVar = (1, "one")doSomething(tupleVar)
  • 高级实例

假设有一个数组

//模拟情绪数据var emotions : [(type : String, strength: Int)] = [("happy",0),("scared",0),("tender",0)]

我想遍历数组,然后对happy进行+1,应怎么做?

for (ix,emo) in enumerate(emotions) {   if emo.type == "happy" {     emotions[ix] = (type:emo.type,strength:emo.strength+1)   }}

有没有更高级的做法?有!

//这里用到了map,具体方法可以google一下,本文不涉及emotions = emotions.map  {  emo in  if emo.type == "happy" {    return (type:emo.type,strength:emo.strength+1)  } else {    return emo  }}
  • 可以将多个值保存在一起
格式: (数值1, 数值2, 数值3)let numbers = (10, 11, 12)// 通过索引访问numbers.0numbers.1numbers.2
  • 特点: 元祖可以保存不同数据类型的值
let person = (name: "lnj", age: 30, score: 100.0)//let values: (String, Int, Double) = ("lnj", 30, 99.9)//let values = ("lnj", 30, 99.9); let (String, Int, Double) = values// 通过名称访问person.nameperson.ageperson.score
  • 用途:
C/OC中如果一个函数想返回多个值需要借助指针, 而在Swift中有了元祖之后就不用通过指针了元祖和数组一样, 可以通过索引访问元祖中保存的值可以给每一个值起一个名字, 将来通过这个名字访问对应的值可以在定义的同时就取出元祖中的值// 相当于同时定义了三个变量let (name, age, score) = ("lnj", 30, 99.9)nameagescore
  • 使用元组返回多个值
func maxminScores ( scores:[Int] ) -> (maxscore:Int, minscore:Int)    {        var curmax = scores[0], curmin = scores[0]        for score in scores[1..<scores.count]        {            curmax = max(curmax, score)            curmin = min(curmin, score)        }        return (curmax, curmin)    }
原创粉丝点击