一、类与结构体
两者在Swift中差不了多少了
类与结构体有很多相同的地方: (第2,3点是其他语言中不存在的)
1)都可以定义属性/方法/下标(结构体也可以定义方法了)
2)都能初始化(通过构造方法)
3)都能使用扩展(extension)与协议(protocol)
4)类与结构体(枚举)中的全局属性/方法:在类中用class关键字,但在结构体中用static
类比结构体多的功能:
1)能继承
2)运行时能检查类对象的类型
3)析构释放资源
4)引用计数允许一个类实例有多个引用
- classPerson1{
- varname="jack"
-
- }
-
- structPerson2{
- varage:Int
-
- }
-
- //1.1实例化类与结构,默认构造器
- letp1=Person1()
- letp2=Person2(age:10)
二、属性(存储属性--计算属性--类属性)
2.1存储属性:就是存储一个常量或变量,类似Java中的成员变量
classPerson3{
- varname:String="xuneng"
- varage:Int=10
- letheight=175
- lazyvarp1:Person1=Person1()
- varp3=Person3()
- p3.name
- p3.age=11
- //延迟lazy存储属性:当使用改属性时才进行初始化,好处是避免空间浪费
- println(p3.p1)
2.2计算属性:不直接存储值,而是用get/set来做.可用来操作其他属性值的变化
get:取,用来封装取值的过程
set:设,用来封装设值的过程
copy
classPerson4{
varname:String="jack"
varjjLength:Int= varage:Int{
get{
returnjjLength*2
set(newAge){
jjLength=newAge/2
varp4=Person4()
p4.age=10
2.2.1简便的计算属性写法
copy
//默认参数newValue,表示新赋给的值
classPerson5{
//用newValue
varjjLength:Int=10
varage:Int{
get{
set{
jjLength=newValue///只读计算属性
varheight:Int{
4
varheight2:Int{
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=newValue
}
只读计算属性
只有 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关键字修饰.类属性只能是计算属性.
类属性就是类似java中static修饰的属性.一个类只有一份,且多个实例对象共享.可直接用类名调用
copy
classPerson7{
classvarname:String{
return"xuneng"
Person7.name
2.4属性监视器:可用来监视属性变化的2个方法willSet,didSet
计算属性因为有get和set方法,因此监视器其实对计算属性没多大用处.对存储属性用处大
初始化值时,不会调用willSet与didSet
willSet,didSet和set,get不能共存
copy
classPerson8{
varname:String="xuneng"{
willSet{
println("新值为:(newValue)")
didSet{
println("新值为:(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相同
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]
示 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|