当前位置: 首页 > 科技观察

Swift高级语法学习总结

时间:2023-03-13 07:11:32 科技观察

1、函数1.1funcfuncNmae()->(){}这样就定义了一个函数,它的参数为空,返回值为空。如果有参数和返回值,直接写在两个括号里就可以了。1.2参数需要指定类型,如果没有返回值可以不写->(),返回值只需要写返回类型,如果写返回名可以用点语法函数调用后取值1.3参数名前可以加外部参数名,调用时带上即可。如果外部参数名与内部参数名相同,可以直接在内部参数名前加#。1.4如果给参数设置一个默认值,swift会自动加上外部参数Name,如果不想在前面使用下划线,可以使用_,如果默认值参数不在***中,不能省略,传参时可以传入下划线。1.5在最后一个参数后面加上...表示这个参数是可变参数,类型就是它。参数个数至少为0,可以在函数中使用forin参数获取这些参数。1.6每个参数前面其实都有一个隐藏的关键字let。如果想让参数是可变的(Assignable),需要加上var关键字,但是只能赋值,因为是值拷贝,所以不能修改外部参数的实际值。如果想按地址传递,需要在参数前加inout关键字,而实参需要加&,1.7swift中的函数其实只是中间类型,函数名就是变量名,这样asletfunc1:()->()声明了一个无参数无返回值的函数类型,所以如果一个函数返回一个函数和返回一个普通变量没有区别2.闭包2.1一个闭包代表了一段程序代码,{(传入参数)->typeofreturnvaluein...expression...},函数只是一个闭包的特例2.2闭包可以推断返回类型,所以可以省略->返回值类型,参数类型也可以压入,所以参数类型不是必须的,括号也可以去掉。如果闭包只有一个表达式,返回键可以直接省略的话,因为我们可以用$0/$1来简写参数,所以参数也可以省略。2.3如果闭包是函数的第一个参数,可以去掉括号,直接使用花括号里的内容,但是花括号需要紧紧的然后写,调用trailingclosure2.4内层return函数会捕获值的外部变量。内层函数返回时,外层函数的内层变量不会释放内存,其变量的值会跟随内层函数的值。执行并更改3.枚举3.1使用enumCompassPoint{caseNorth,South,East,West}定义枚举,不需要逗号,可以像声明语句一样分多个case单独写3.2可以使用元组在枚举的每一项中设置值,可以将值绑定在switchcase来判断,3.3如果枚举类型初始化为Int类型,它的下一项也会有原值加1,但是枚举可以直接复制成字符串4.结构4.1结构题的属性必须是初始化后,必须有默认值或者通过构造函数init4.2结构体本身传值。如果一个结构赋值给另一个结构,有两份,相互修改不影响4.3如果一个结构用let声明,那么它的内部值不能再修改,只能修改var声明的结构4.4但是类不同,对象的赋值会是同一个引用,修改会影响另一个对象,但是let声明的变量不能赋值,只能修改其内部值。5.属性(成员变量)5.1结构体/类的成员变量在初始化时必须有值。init方法,如果你提供了,默认就没有了。5.2(惰性属性)用let声明的成员变量不能再被修改。如果是耗时属性比如value是自定义对象,可以添加lazy属性,只有在使用的时候才会初始化这个属性,避免不必要的消耗(延迟属性)5.3(计算属性)有些属性是是根据其他属性计算的,不是必须的属性,只是为了方便使用,在属性定义后加一个set/get方法。get方法需要返回一个值。set方法有一个参数来设置其他属性。如果不需要参数,就不要在参数外面写括号。有一个默认参数newValue5.4如果只有get方法是只读属性,只读属性swift提供了一种简写方式,只需要在最外层的花括号中写return语句即可。5.5swift提供了属性监听方法:willSet和didSet,两者参数相同,要设置的值,属性的过去值。同样,如果不提供参数,将使用两个默认的newValue和oldValue。这两个方法与set/get方法并列。在didSet方法中,可以直接修改(调整)属性的值,但这两种方法不能与set/get方法共存。5.6swift中有category属性,enum/struct使用关键字static,class使用class关键字,声明在letinclass中初始值需要直接赋值,var声明必须使用get方法return,因为swift不允许类存储类属性,但是enum/struct可以6.函数(成员方法)6.1类中的函数不需要添加外部参数,因为除了第一个参数外,默认添加#符号,但这只是swift为你做的,它不强制你在语法上做任何事情,你也可以添加外部参数第一个参数是的,可以用_代替默认的外部参数。6.2在swift中,self.x并不意味着会调用setX/getX方法,所以直接在set/get方法中使用即可。6.3在struct和enum中,成员方法是不允许修改成员变量的。如果要修改,需要加上mutating关键字,但是如果声明的结构变量是let常量,则不允许调用该方法。6.4在struct和enum中,可以直接跟在mutating方法中将self赋给另一个变量6.5在struct和enmu中使用static将一个方法标记为类方法,在类中使用class关键字7.下标(subscript)7.1重写下标,类似subscript(index:Int)->Int{},里面包含set/get方法,并声明变量,根据传入的参数和返回值判断下标类型和返回值,重写这个方法,对应的类型可以用作下标。7.2下标方法参数数字对应下标的个数,例如两个参数:mar[2,3]8.继承8.1swift中没有基类,所有不继承其他类的类都是基类,重写父类中的init方法,需要先调用super的init方法,后面再修改属性的值。要访问属性,您可以直接使用属性名称而不是使用self。8.2重写属性和重写方法类似,直接加个override即可,重写的set/get方法也可以调用super对应的属性值,或者设置值。8.3重写didSet属性monitor不能再重写set/get方法,在方法或属性中加上finalkey可以防止被子类重写9.初始化(init)9.1init方法同普通方法。需要在init方法中对每一个必须赋值的属性进行赋值,否则会出现编译错误,init方法会给每个参数加#,如果不想,可以用_,方法内部使用self访问,否则不需要9.2如果自定义init方法,那么swift就不再提供默认的init方法了,可以自己写一个init方法,init方法可以带参数,也可以不带参数,自己决定9.3如果想在一个init方法中调用另一个init方法,需要加一个convenience关键字,在这个init方法中可以调用另外一个init方法。类的属性,***可以修改子类和父类的属性。如果这个属性是属于父类的,在子类中也是self访问的,因为这个属性已经是自己的了。9.5如果子类有一个init方法没有提供,那么子类继承了父类的所有构造函数,可以用父类的init方法进行初始化。9.6初始化属性时,可以用闭包来实现。只要在复制的=后面加上{},你写return和其他语句一样,***在{}后面加一个()表示闭包立即执行。闭包和属性的set方法类似,只是在开头提供了。10.deinit方法(deinit)10.1deinit方法会在对象销毁的时候被调用,可以打印出来判断什么时候销毁对象之间的相互引用会产生引用循环,所以需要声明弱引用with关键字weak的属性之一,也就是你可以将它设置为nil11.2一般weak声明使用可选类型,因为它可能引用nil,如果你在调用它的时候能确定它有值,您可以将其声明为无主的公共类型。它的作用是,如果调用的时候能保证这个属性不为nil,swift推荐使用unowned,其他都和weak一样12.可选链(OptionalChaining)12.1对于一个可选类型的属性,可以使用?。和!。访问,如果确定有值,可以用a!.b!.c!.d,如果不确定有值,可以用a?.b?.c?.d13.类型转换13.1可以通过aisb判断对象a是否为b类型,返回值为boolean值13.2可以转换普通类型,比如double,int,cgfloat等可以转换成13.3.你可以用吗?将类转换为父类。它的结果可以是nil或者转换成功,所以结果是一个可选类型。转换成功后,使用?。访问方法或属性,也可以做可选绑定13.4如果一个对象可以转换成功,就可以使用as!转换它。如果转换不成功,将报告运行时错误。例如,一个数组中全是动物,但声明为anyobject时可以这样使用。14.Extension/Protocol(categories,extension,protocol)14.1swift的扩展没有名字,扩展到所有实体类,不能添加成员属性,但是可以添加计算属性14.2属性和方法可以声明在protocol,并且可以定义属性只读或者可读可写14.3一个扩展可以继承一个协议,并在其中实现相应的方法14.4协议类型为protocol15.泛型15.1可以在func或者struct后面跟上,可以在参数中声明参数类型为this类型,可以看做是一个类型。16.运算符重载16.1运算符可以在swift中重载。方法名是运算符符号,参数的个数和类型根据运算符的个数和运算符两边对应的参数类型来确定。