//: 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)")
}