Swift类与结构、存储属性、计算属性、函数与方法、附属脚本等

Swift类与结构、存储属性、计算属性、函数与方法、附属脚本等,第1张

概述一、类与结构体 两者在Swift中差不了多少了 类与结构体有很多相同的地方: (第2,3点是其他语言中不存在的) 1)都可以定义属性/方法/下标(结构体也可以定义方法了) 2)都能初始化(通过构造方法) 3)都能使用扩展(extension)与协议(protocol) 4)类与结构体(枚举)中的全局属性/方法:在类中用class关键字,但在结构体中用static 类比结构体多的功能: 1)能继承

一、类与结构体

两者在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简便的计算属性写法

copy //默认参数newValue,表示新赋给的值 classPerson5{ //用newValue varjjLength:Int=10 varage:Int{//只能是var get{ set{ jjLength=newValue///只读计算属性 varheight:Int{ 4 varheight2:Int{//只读直接可以省略get 4 varp5=Person5() p5.height //p5.height=10//只读的不能赋值

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方法 }


只读计算属性 只有 getter 没有 setter 的计算属性就是只读计算属性。只读计算属性总是返回一个值,可以通过点运算符访问,但不能设置新的值。
注意:必须使用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关键字修饰.类属性只能是计算属性.

类属性就是类似javastatic修饰的属性.一个类只有一份,且多个实例对象共享.可直接用类名调用

copy classPerson7{ classvarname:String{ return"xuneng" Person7.name
2.4属性监视器:可用来监视属性变化的2个方法willSet,didSet

计算属性因为有getset方法,因此监视器其实对计算属性没多大用处.对存储属性用处大

初始化值时,不会调用willSetdidSet

willSet,didSetset,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 selfsuper,OC相同

copy classPerson11{ self.fun()//对象方法调用对象方法,类方法调用类方法 funcfun(){ println("hello") }
四、下标(附属脚本 下标,有的叫附属脚本(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类与结构、存储属性、计算属性、函数与方法、附属脚本等所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1071841.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存