Swift的结构体,枚举,可选Optional,可选链

//: Playground - noun: a place where people can play

 

import Cocoa

 

var str0 = "Hello, playground"

//类是引用类型,结构体与枚举是值类型

 

//*****************结构体***************

struct Point {

    var x = 0

    var y = 1

    //结构体的的方法

    //为了能够在实例方法中修改属性值,可以在方法定义前添加关键字mutating

    mutating func change (newX: Int,newY: Int) {

        x = newX

        y = newY

    }

}

var p = Point()

p.change(1, newY: 2)

p.x

p.y

//自动帮你添加一个包含所有成员的初始化器,memberwise init

var p2 = Point(x: 5, y: 6)

p2.x

 

let p3 = Point()

//p3 = Point() 报错,let定义的p3是常量指针

//p3.x =20 struct是个值类型,所以也报错

 

//**************枚举************

enum Gender {

    case Male

    case Female

}

//枚举的使用

let ch: Gender = .Male

//也可以这样定义

//let ch2 = Gender.Male

switch ch {

case .Male:

    print("男")

case .Female:

    print("女")

}

//*************枚举的关联值*********

enum Gender2 {

    case Male(String)

    case Female(Int,String)//()里面可以关联任意类型,每个case关联的数据都可以不一样

}

let ch3 = Gender2.Male("男")

switch ch3 {

case.Male(let c):

    print("性别是\(c)")

case.Female:

    print("性别女")

}

let cx = Gender2.Female(11,"女")

switch cx {

case.Male(let c):

    print("性别\(c)")

//case.Female(let c,let x):

case let.Female(c,x)://这里如果c,x都是let的话,可以这样定义

    print("性别\(x),年龄\(c)")

}

//************枚举的原生值***********

//原生值,如果你不给它赋值的话,它默认是从0开始的,就想下面的x = 1,因为是默认从0 开始,那Approved就等于 1,那样违背了原生值得唯一性,所以出错。假设x = 3,那后面的y就会等于4,如果还有case,就5,6,7,8...一直这样下去

enum Status :Int {//所有的原生值都得是唯一的

    case UnApproved

    case Approved

    case x = 3//x = 1就报错

    case y

}

let s = Status.x

s.rawValue

let s2 = Status.y

s2.rawValue

s2.hashValue //显示上一个case的原生值

 

//可选的Optional

var str: String? = "chenhe"//加?后str是一个可以设置nil的String

//str = nil;

let i: Int?//加?后不给它赋值,默认就是nil

str?.startIndex//取出nil值

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

//遇到这种情况,有两种方法解决Optional问题

//第一种

str!.startIndex

str!

//第二种

if let s = str {

    print("\(s)")

}else {

    print("str值是nil")

}

//简便写法

var str2: String! = "chenxuan" //隐式解封

str2 = nil

//当str2赋值了nil时,str2!输出值为nil,没有赋值nil则输出字符串内容

 

 

//****************optional chain 可选链******************

//多级别可选链

class Person {

    var ci:ClassInfo?

}

class ClassInfo {

    var t:Teacher?

}

class Teacher {

    var name = "cj"

}

var p0 = Person()

var ci = ClassInfo()

var t = Teacher()

p0.ci = ci

ci.t = t

p0.ci?.t?.name = "chenhe"

p0.ci?.t?.name

p0.ci!.t!.name

if let n = p0.ci?.t?.name { //也可以用可选绑定

    print("\(n)")

}

 

posted on 2015-11-04 21:03  陈鹤  阅读(255)  评论(0编辑  收藏  举报

导航