首页 > 编程语言 > 详细

浅谈swift中的那些结构体和枚举

时间:2015-11-18 23:00:26      阅读:349      评论:0      收藏:0      [点我收藏+]

首先呢, 我们先写一个struct

struct Point {
    var x = 0
    var y = 1
    mutating func change (newX:Int,newY: Int) {
        x = newX
        y = newY
    }
}

 var p1 = Point(x: 4, y: 4)

p1.x  //4
 

在这里呢,可能有人会问,为什么在func前面要加一个mutating,

如果不加的话, 编译器抛出错误,报出不能在实例方法中修改属性值

所以呢, 我们必须如果想改变成员变量的话, 就必须要在func前面加一个mutating

在这里要注意一下的就是,struct 是一个值类型

let p = Point()

p.x = 20 //报错

p = Point() //报错,let作用

 

枚举为一系相关联的值定义了一个公共的组类型.同时能够让你在编程的时候在类型安全的情况下去使用这些值。

你可以用enum开始并且用大括号包含整个定义体来定义一个枚举:

enum{
 case  
 case
}

首先呢,我们先创建一个枚举

enum Gender {
    case Male(String)
    case Female(Int,String) //表示可以关联任意类型,每个case关联的数据可以不一样

}

我们事例化一个枚举对象

let wd = Gender.Male("")

switch 判断一下

switch wd {
case .Male(let x):
    print("这个是\(x)")  //"这个是男"
case .Female:
    print("nv")
}

还可以事例化两个参数

let hy = Gender.Female(18, "zs")

switch一下

switch hy {
case .Male(let x):
    print("zhe shi ge \(x)")
case let .Female ( x , y): //相当于x与y都是let
    print("nv\(x,y)")  //"nv(18,zs)"
}

好了, 枚举就介绍到这里就结束了, 

还有补充一下, 关于?和!的链式操作()

var i:String?="ddd"  和 var i:String!="ddd" 是Optional

?表示该值可以为ni,如果是一般的数据类型是不允许为nil,在链式操作中如果是nil的话,不报错

! 称之为隐式的解封,强制转换,在链式操作中如果是nil的话,就直接报错

下面我们来写个案例来区别两者,首先呢, 如果不赋值的话, 都是默认的是nil

var a : String?           //a 为nil
var b : String!           //b 为nil
var a_test = a            //a_test为nil
var b_test = b            //b_test为nil

我们定义两个String变量

var str: String? = "asdfasdf"
var str1: String! = "asdfasdf"
 

我们来调用字符串的方法

str.startIndex//会报错,因为此时str不是一个真正的String,所以没有startIndex
str1.startIndex //不会报错

链式操作实例

class Person {
    var ci: ClassInfo?
   }
class ClassInfo {
    var t:Teacher?
}
class Teacher {
    var name = "cj"
}
let p = Person()

let t = Teacher()
let ci = ClassInfo()
ci.t = t
p.ci = ci
p.ci?.t?.name = "double"
p.ci?.t?.name   //"double"
p.ci!.t!.name  //可以强制解封"double"

 

 

总结

    1. 问号?
      a.声明时添加?,告诉编译器这个是Optional的,如果声明时没有手动初始化,就自动初始化为nil
      b.在对变量值操作前添加?,判断如果变量时nil,则不响应后面的方法。
    2. 叹号!
      a.声明时添加!,告诉编译器这个是Optional的,并且之后对该变量操作的时候,都隐式的在操作前添加!
      b.在对变量操作前添加!,表示默认为非nil,直接解包进行处理

 

浅谈swift中的那些结构体和枚举

原文:http://www.cnblogs.com/zhengyc/p/4975925.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!