首先呢, 我们先写一个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"
总结
- 问号?
a.声明时添加?,告诉编译器这个是Optional的,如果声明时没有手动初始化,就自动初始化为nil
b.在对变量值操作前添加?,判断如果变量时nil,则不响应后面的方法。 - 叹号!
a.声明时添加!,告诉编译器这个是Optional的,并且之后对该变量操作的时候,都隐式的在操作前添加!
b.在对变量操作前添加!,表示默认为非nil,直接解包进行处理
时间: 2024-10-13 22:27:42