IOS-笔记4(类,结构体,枚举)

class{


}

struct{


}

enum{


}

他们都有自己的属性和方法,有一些小不同。


他们都可以有函数,都可以有计算型属性:

var computedProperty:Type{
      get{}
      set{}
}


但是枚举不能有存储型属性:var storedPorperty=<initial value>;也不能有构造器。


只有class可以继承、内省和转型。


       他们三个最主要的区别是:结构体和枚举的储存和传递是通过值传递的,也就是复制和拷贝(swift中,数组是值传递);而类是引用传递的,类的对象会存放在内存中,存放在内存中的对象系统会替我们进行管理,我们不需要自己去开辟和释放内存空间。但这并不是垃圾回收机制,是自动引用计数。


you must note any func that can mutate a struct/enum with the keyword mutating.


在使用类时:override,final是可以使用的,final不仅可以修饰类的成员和属性,同样可以用来修饰类本身。


类型和实例都可以有自己的属性和方法:

var  d:Double =0.1
if d.isSignMinus {
     d=Double.abs(d)
}


这其中isSignMinus就是实例的方法,.abs()就是类型的方法,在声明一个类型方法时,在前面加上static关键字,这时在使用这个方法时就需要使用类型点上这个方法。同样的在声明一个类方法时你可以加上class关键字。

函数的参数名有内部名和外部名之分,可以不定义外部名。在调用时第一个参数可以直接写,之后的参数需要加上内部名冒号,如果定义了外部名就加上外部名冒号。


property observers

var someStoredProperty:Int = 42 {
      willSet {newvalue ......}
      didSet {oldValue ......}
}
对于非计算属性的属性后面也可以加上花括号,里面的方法willSet在被赋值前调用,didSet在被赋值后调用。这在IOS中经常被用来更新UI界面。


lazy关键字可以用来修饰var关键字的属性,这个属性只有在被用到时才会初始化。当这个属性是一个复杂的类的对象或闭包时很有用(闭包后要加上()来执行闭包)


初始化:

        对于结构体来说,你会有一个默认的初始化函数,调用时只需要写结构体名称()括号里写上初始化的值就可以。

        类的初始化函数里可以初始化let类型的变量,但是一旦初始化完成就不能变了。 

        当初始化工作结束后所有属性都需要有值。

        在类中有两种初始化函数:convenienc init和designated init:

                designated init必须,也只能调用父类的designated init,不能调用本类里的其他init方法;在调用父类的init方法之前必须完成本类属性的初始化;在调用父类的初始化         方法才能使用父类的属性。

                convenience init只能调用本类的designated init;也可以通过调用其他的convenience init来间接调用designated init,不管你套着调用几个convenience init,最终调           用的那个convenience init里一定要调用一个designated init;必须先调用一个designated init后才可以设置类的属性。

继承初始化:(简直醉了)

        如果你没有实现任何designated init,你会继承所有的父类designated init;如果实现了一个,就一个都不继承。

        如果你复写了所有的父类的designated init,你会继承父类所有的convenience init。

        如果你一个init都没有实现,你会继承父类所有的init

        在父类中,你可以在初始化方法前加上required来要求子类必须实现这些方法,如果按照之前的规则,子类继承了父类required的方法那OK,如果没有继承,子类需要手动         实现。

可失败的初始化,会返回一个Optional值来告诉你初始化是不是失败了。


AnyObject,这是一个用于与Objective-C兼容的类型,在使用它之前需要将它转换为它应该是的那个类型。可以通过设置一个有类型的变量来接它,也可以通过as关键字强制转换。在转换的过程中如果你转换出来的不是它本身是的类型,程序会报错。如果你怕程序报错,可以用as?这样会返回一个Optional。也可以用is关键字来事先检查是不是你想要的类。


数组的+=方法只能是两个数组,如果只是添加一个元素,放在方括号里。数组还有很多好用的方法,基本你想到的都有了。甚至有自定义函数的排序算法。

        first    last   append(T)    insert(T, atIndex: Int)    splice(Array<T>, atIndex: Int)    removeAtIndex(Int)    removeRange(Range)    replaceRange(Range, [T])    

        sort(isOrderBefore:(T, T) ->Bool) 这个函数接收一个函数参数,可以用闭包的形式来实现)

        filter(includeElement: (T) -> Bool) -> T             map(transform: (T) -> U) ->  [U]       reduce(initial: U, combine: (U, T) -> U) -> U


在处理字符时,使用.startIndex来获得索引,用advance(index, Int)方法向后推进索引。

        splice("", index)

索引可以用在Range语句中来创建子字符串


assert(() -> Bool, "message")这句话在调试的过程中非常有用,可以在想要的条件下输出相应的信息。其中第一个参数接收一个闭包,通过执行闭包里的内容来决定是否打印字符串。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值