IOS-笔记6(拓展,协议)

本文介绍了iOS编程中如何使用Extensions为现有类、结构体和枚举添加功能,强调了扩展的特点和限制。同时,深入探讨了Protocol的概念,包括协议的声明、继承以及属性和方法的定义。协议可以通过设置可读写属性、mutating关键字和指定初始化方法来规范实现者。文中给出了一个具体的协议声明和结构体实现的例子,强调了Self关键字在协议中的作用以及范型的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Extensions

     使用这个可以给现存的类,结构体和枚举添加属性和方法,属性的话只能添加计算属性。现有的属性和方法不可以被复写。可以很简单的添加一些小方法,也可以用来构建整个软件的构架。


protocol

     这是一个数据类型,但是他只有声明没有实现。实现由使用这个协议的类和枚举和结构体来实现。

     协议可以继承。

     在写协议的时候,声明属性时需要通过set,get来指定这个属性的可读和可写性。会改变接收者值的函数则需要加上mutating关键字。通过声明init方法还可以规定协议实现者实现规定的初始化方法,这时要注意在实现时(类)要加上required关键字。

这里声明一个协议:

protocol Moveable {
      mutating func moveTo(p: CGPoint)
}

在声明一个协议时,使用Self来作为变量的类型,在实现时就可以在这里使用实现这个协议的类型

但要注意这时实现要使用范型

protocol Ordered {
  func precedes(other: Self) -> Bool
}
原来这样实现时就不行了
func binarySearch(sortedKeys: [Ordered], forKey k: Ordered) -> Int {...}
得这样实现

func binarySearch<span style="color:#ff0000;"><T : Ordered></span>(sortedKeys: [<span style="color:#ff0000;">T</span>], forKey k: T) -> Int {...}

一个实现它的类:

class Car : Moveable {
      func moveTo(p: CGPoint)  {.....}//这里并不需要加mutauing
      func changeOil()
}

一个实现它的结构体:

struct Shape : Moveable {
      mutating func moveTo(p: CGPoint) {....}
      func draw()
}

初始化两个实例:
let prius: Car = Car()
let square: Shape = Shape()
var thingToMove: Moveable = prius//一个协议类型的变量,可以被一个实现了这个协议的实例赋值
thingToMove.moveTo(...)//可以调用实例对象中实现的协议的方法
thingToMove.changeOil()//这个方法则调用不了,即使这个类里确实有这个方法
我还可以这样定义一个数组:

let thingsToMove: [Moveable] = [prius, square]//虽然他们一个是类一个是结构体
还可以将协议用做参数:

func slide(slider: Moveable) {
      .......
}
slide(prius)
slide(square)
当参数需要满足多个协议时:

func slideAndSlide(x: protocol<Slippery, Moveable>)
slideAndSlide(prius)//这时这句话就会报错了







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值