一、类与结构体
两者在Swift中差不了多少了
类与结构体有很多相同的地方: (第2,3点是其他语言中不存在的)
1)都可以定义属性/方法/下标(结构体也可以定义方法了)
2)都能初始化(通过构造方法)
3)都能使用扩展(extension)与协议(protocol)
4)类与结构体(枚举)中的全局属性/方法:在类中用class关键字,但在结构体中用static
类比结构体多的功能:
1)能继承
2)运行时能检查类对象的类型
3)析构释放资源
4)引用计数允许一个类实例有多个引用
[java] view plain copy classPerson1{ varname="jack" //classvarheight:Int=10//错误!类中不能有全局存储属性的,只能是计算属性.见下文说明 } structPerson2{//结构体更像Java中的类 varage:Int //staticvarheight:Int=10//可以设定全局属性,需要初始化. } //1.1实例化类与结构,默认构造器 letp1=Person1() letp2=Person2(age:10)//当使用默认构造器时,必须初始化里面所有的属性
二、属性(存储属性--计算属性--类属性)
2.1存储属性:就是存储一个常量或变量,类似Java中的成员变量
copy classPerson3{ varname:String="xuneng"//需要手动初始化 varage:Int=10 letheight=175 lazyvarp1:Person1=Person1()//延迟,必须是var varp3=Person3() p3.name//通过点语法来访问 p3.age=11//设置 //延迟lazy存储属性:当使用改属性时才进行初始化,好处是避免空间浪费 println(p3.p1)//这句调用时,p1才进行初始化2.2计算属性:不直接存储值,而是用get/set来做.可用来 *** 作其他属性值的变化
get:取,用来封装取值的过程
set:设,用来封装设值的过程
copy classPerson4{ varname:String="jack" varjjLength:Int= varage:Int{//只能是var get{ returnjjLength*2 set(newAge){ jjLength=newAge/2 varp4=Person4() p4.age=10//当设age为10时,jjLength变为5 2.2.1简便的计算属性写法
2.2.2注意计算属性的死循环情况
计算属性的值是不固定的,因此不能用let修饰,只能用var
计算属性不能直接赋值
set和get 是针对 计算变量(Calculated property ) 是不可以赋值的 普通的存储变量(storage property)才是可以赋值的
对属性赋值进行监视最好就是用willSet{ }
copy classPerson6{ //用newValue //varheight2:Int=10{//不能直接赋值,否则成存储属性了 //returnjjLength*4 //} varage:Int{ returnage//死循环.age会调用get方法 age=newValue//死循环.age设值时会调用set方法 }
注意:必须使用var关键字定义计算属性,包括只读计算属性,因为他们的值不是固定的。let关键字只用来声明常量属性,表示初始化后再也无法修改的值。只读计算属性的声明可以去掉get关键字和花括号:
struct Cuboid { var width = 0.0,height = 0.0,depth = 0.0 var volume: Double { return width * height * depth } } let fourByFiveByTwo = Cuboid(width: 4.0,height: 5.0,depth: 2.0) println("the volume of fourByFiveByTwo is \(fourByFiveByTwo.volume)") // 输出 "the volume of fourByFiveByTwo is 40.0"这个例子定义了一个名为Cuboid的结构体,表示三维空间的立方体,包含width、height和depth属性,还有一个名为volume的只读计算属性用来返回立方体的体积。设置volume的值毫无意义,因为通过width、height和depth就能算出volume。然而,Cuboid提供一个只读计算属性来让外部用户直接获取体积是很有用的。
2.3类属性(或者叫做类型属性)用class关键字修饰.类属性只能是计算属性.
类属性就是类似java中static修饰的属性.一个类只有一份,且多个实例对象共享.可直接用类名调用
copy classPerson7{ classvarname:String{ return"xuneng" Person7.name2.4属性监视器:可用来监视属性变化的2个方法willSet,didSet
计算属性因为有get和set方法,因此监视器其实对计算属性没多大用处.对存储属性用处大
初始化值时,不会调用willSet与didSet
willSet,didSet和set,get不能共存
copy classPerson8{ varname:String="xuneng"{ willSet{ println("新值为:\(newValue)")//newValue新值 didSet{ println("新值为:\(oldValue)")//oldValue表示旧值 varp8=Person8() p8.name="jack"//这句调用
三、函数与方法
3.1对象方法
类中的方法与函数的一点区别:方法的第一个参数以后,全是外部参数.名字即为参数名
copy classPerson9{ funcsum(num1:Int,num2:Int){ println(num1+num2) varp9=Person9() p9.sum(10,num2://第一个参数以后,全是外部参数.相当于加了#3.2类方法.用class修饰
copy classPerson10{ classfuncsum(num1:Int,num2:Int){ Person10.sum(10)
3.3 self与super,与OC相同
四、下标(附属脚本) 下标,有的叫附属脚本(subscript), 新东西。
可以定义在类/结构体/枚举中,进行快速访问。
copy //格式:也可以设定set/get /* subscript(index:Int)->Int{ get{ } set{ } */copy structPerson12{//官方很多用的结构体 letjjLength:Int//结构体在这里可以不初始化 subscript(index:Int)->Int{ returnjjLength*index varp12=Person12(jjLength:10) p12[3]//直接像访问数组一样访问.根据jj长度,index为3,值为30
示
总结以上是内存溢出为你收集整理的Swift类与结构、存储属性、计算属性、函数与方法、附属脚本等全部内容,希望文章能够帮你解决Swift类与结构、存储属性、计算属性、函数与方法、附属脚本等所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)