swift学习笔记十六:协议

phlsheji      2022-02-13     370

关键词:

Protocol(协议)用于统一方法和属性的名称,而不实现不论什么功能。

协议可以被类。枚举。结构体实现。满足协议要求的类,枚举,结构体被称为协议的遵循者
遵循者须要提供协议指定的成员,如属性,方法,操作符,下标等。

一、协议的基本的语法

     咱们还是先上代码吧

protocol Human {
    var name:String{ get set }
    var isMan:Bool{set get}
    class var isUsable:Bool { set get }  //类成员。表示这个类是否可用
    func ageDescription(ages:Int...)     //函数參数能够是变长參数
}
class Student{
    var name = ""
}
class PrimaryStudent:Student,Human{
    class var isUsable:Bool{
        get{    return self.isUsable    }
        set{    self.isUsable = newValue    }
    }
    var isMan:Bool
    init(name:String,isMan:Bool){
        self.isMan = isMan
        super.init()
        self.name = name
    }
    func ageDescription(ages:Int...){
        var ageCount = 0
        for age in ages{
            ageCount += age;
        }
        println("this man age is (ageCount)")
    }
}


重点:
     ① 遵守某个协议须要像继承一样。在:后面加入这个协议
     ② 假设既要继承又要遵守协议,须要把继承的父类放在最前面
     ③ 对于协议中的属性,须要标明属性的读写类型,能够是读写或者仅仅读(不能仅仅写不读)
     ④ 对于类成员,须要在协议中的属性前面加classkeyword,假设是类遵守协议加classkeyword,假设是枚举或者结构体遵守协议加statickeyword
     ⑤ 协议中方法支持变长參数,但不支持參数默认值

二、协议类型
     虽然协议本身并不实现不论什么功能,可是协议能够被当做类型来使用。
使用场景:
协议类型作为函数、方法或构造器中的參数类型或返回值类型
协议类型作为常量、变量或属性的类型
协议类型作为数组、字典或其它容器中的元素类型

protocol RandomNumberGenerator {
    func random() -> Double
}
class Dice {
    let sides: Int
    let generator: RandomNumberGenerator
    init(sides: Int, generator: RandomNumberGenerator) {
        self.sides = sides
        self.generator = generator
    }
    func roll() -> Int {
        return Int(generator.random() * Double(sides)) + 1
    }
}

class LinearCongruentialGenerator: RandomNumberGenerator {
    func random() -> Double {
        return random()%10.0
    }
}
var d6 = Dice(sides: 6,generator: LinearCongruentialGenerator())

解释:
     在Dice中。generator是RandomNumberGenerator协议类型。

所以仅仅能使用遵守RandomNumberGenerator协议的类、结构体、枚举类型给他赋值。在后面我们能够看到,在初始化的时候使用遵守RandomNumberGenerator协议的LinearCongruentialGenerator给他赋值了

三、托付代理模式
     玩过Objective-C的朋友相比对托付代理非常熟悉了,Swift中的托付代理和OC的大同小异,我们还是来看看代码吧

protocol NameComplete {
    func nameSetCompleted(theName:String)
}
class Student{
    var delegate:NameComplete?
    var name:String{
    didSet{
        self.delegate?.nameSetCompleted(name)
    }
    }
    init(name:String,delegate:NameComplete){
        self.name = name
        self.delegate = delegate
    }
    
}
class DoSth:NameComplete{
    func nameSetCompleted(theName:String){
        println("name:(theName) is set ")
    }
}
var a = DoSth()
var b = Student(name:"",delegate:a)
b.name = "小笨狼"  //输出:name:小笨狼 is set

解释:
     NameComplete是一个代理。DoSth遵从并实现这个代理,Student调用代理。

在Student中name被赋值之后,代理中nameSetCompleted方法会被调用
     
三、可选协议
     玩过OC的朋友知道。OC中协议有的方法是可选的。在Swift中协议也有这个功能,以下我们来看看

@objc protocol Human{
    @optional var name:String{get set}
    @optional func descript()
}
class Student:Human{
    var name:String = "abc"
    func descript(){
    println("abc")
    }
}

重点:
     ① 对于可选方法或者属性。须要在方法或者属性前加上@optionalkeyword
     ② 假设协议中含有可选方法或者属性,在定义协议时须要在protocol 前加上@objckeyword
     ③ 在可选协议中,不能出现OC没有的类型。比方变长类型
     ④ 可选协议仅仅能被类遵从

四、协议继承
     协议和类一样。也能够继承

protocol pName{
    var name:String{set get}
}
protocol dName:pName{
    func descript()
}
class Human:dName{
    var name = ""
    func descript(){
        println(name)
    }
}

解释:
     dName继承了pName,所以dName协议不仅含有一个descript方法还含有name属性,所以遵从dName协议的类必须有name属性和descript方法

五、协议合成

protocol Named {
    var name: String { get }
}
protocol Aged {
    var age: Int { get }
}
struct Person: Named, Aged {
    var name: String
    var age: Int
}
func wishHappyBirthday(celebrator: protocol<Named, Aged>) {
    println("Happy birthday (celebrator.name) - you're (celebrator.age)!")
}
let birthdayPerson = Person(name: "Malcolm", age: 21)
wishHappyBirthday(birthdayPerson)   //输出Happy birthday Malcolm - you're 21!

解释:
     wishHappyBirthday方法传入的參数是<NamedAged>合成协议类型,这时能够传入遵从这2个协议的结构体的实例
     注意:
          协议合成并非生成一个新协议。而是多个协议合成一个暂时协议,超出范围后就会失效




swift学习笔记-协议和扩展(代码片段)

协议声明使用protocol来声明协议。protocolExampleProtocolvarsimpleDescription:Stringgetmutatingfuncadjust()协议的遵循类、枚举以及结构体,都可以遵循某个协议。类classSimpleClass:ExampleProtocolvarsimpleDescription:String=“Averysimp 查看详情

swift学习笔记:枚举

目录:基本语法关联值原始值枚举为一组相关的值定义了一个共同的类型。?可以给枚举成员指定原始值类型:字符串,字符,整型值或浮点数等?枚举成员可以指定任意类型的关联值存储到枚举成员中?枚举可以定义构造函数和遵... 查看详情

swift学习笔记-类型转换(代码片段)

类型转换的作用类型转换可以判断实例的类型,也可以将该实例在其所在的类层次中视为其父类或子类的实例。Swift中类型转换的实现为is和as操作符。这两个操作符使用了一种简单传神的方式来检查一个值的类型或将某个值... 查看详情

第十六周学习笔记

 本周的学习笔记主要关于MYSQL日志1.查询日志是否开启 2.查看慢查询日志  3.查看二进制日志  4.删除所有二进制日志文件RESETMASTER;  5.只删除部分二进制日志文件PURGEMASTERLOGS;  查看详情

ros学习笔记(十六)——初级教程学习结束

ROS系统查错的功能:NEW1$roscd$roswtf  #看起来很简单,但是具体怎么用?没搞懂.这部分的内容太少了...来个有用的指令roslocateuri<package_name> 查看详情

zabbix学习笔记(四十六)

Zabbix学习笔记(四十六)-Zabbix系统的报表功能实现​zabbix系统的报表功能,应该是在zabbix5.4版本的时候推出的,由于功能非常简单,只能通过邮件发送pdf文件,至今没有在生产环境中没有使用,甚至测试。今天疫情期间封控在... 查看详情

swift3.0协议笔记

  协议能够要求遵循者必须含有一些特定名称和类型的实例属性(instanceproperty)或类属性(typeproperty),也能够要求属性的(设置权限)settable 和(访问权限)gettable,但它不要求属性是存储型属性(storedproperty)还是计算型属性(c... 查看详情

ng机器学习视频笔记(十六)——从图像处理谈机器学习项目流程

ng机器学习视频笔记(十六)——从图像处理谈机器学习项目流程 (转载请附上本文链接——linhxx) 一、概述        这里简单讨论图像处理的机器学习过程,主要讨论的是机器学习的项目流... 查看详情

swift学习第十六天:懒加载和tableview

懒加载懒加载的介绍swift中也有懒加载的方式(苹果的设计思想:希望所有的对象在使用时才真正加载到内存中)和OC不同的是swift有专门的关键字来实现懒加载lazy关键字可以用于定义某一个属性懒加载懒加载的使用格式lazyvar变量:类... 查看详情

swift电文学习笔记

SWIFT电文学习笔记报文类型用户报文系统报文(SystemMessage)服务报文(ServiceMessage)错误码(ErrorCode)SWIFT电文结构(1)报头HeaderBlock(2)正文TextBlock(3)报尾TailBlock报文收发示例电文格式分类报文功能解释SwiftMT707SwiftMT760(信汇760)SWIFTM... 查看详情

swift电文学习笔记

SWIFT电文学习笔记报文类型用户报文系统报文(SystemMessage)服务报文(ServiceMessage)错误码(ErrorCode)SWIFT电文结构(1)报头HeaderBlock(2)正文TextBlock(3)报尾TailBlock报文收发示例电文格式分类报文功能解释SwiftMT707SwiftMT760(信汇760)SWIFTM... 查看详情

第十五天和十六天学习笔记

第十五天学习笔记:主要学习了HTML5:1<!DOCTYPEhtml><!--文档类型声明-->2<html>3<head>4<title>学习HTML5</title>5<metacharset="UTF-8">6</head>7<body>8<p>学习html5</p& 查看详情

odoo10学习笔记十六:定时任务

一:定义定时器数据模型模型中定义需要用到的字段、定时方法fromodooimportmodels,fields,api,exceptionsimportloggingfromdatetimeimportdatetime_logger=logging.getLogger(__name__)classscheduler(models.Model):_name=‘scheduler.demo‘#需要用到 查看详情

swift学习笔记——基础语法

Swift学习笔记——基础语法本文是针对新手学习Swift笔记,记录学习过程的一些体会以及一些学习过程中的理解:基础语法第一次接触Swift或者Oc语法的时候,总感觉有点像脚本语言,不像Java或者C/C++。当然这... 查看详情

《从零開始学swift》学习笔记(day5)——我所知道的标识符和keyword

??Swift2.0学习笔记(Day5)——我所知道的标识符和keyword 原创文章,欢迎转载。转载请注明:关东升的博客 好多计算机语言都有标识符和keyword,一直没有好好的总结,就是这种用着,如今小小的整理一下Swift中的标识符和... 查看详情

java学习笔记(代码片段)

Java学习笔记进制相关十六进制十进制转十六进制负数转十六进制八进制二进制快捷使用基本概念VectorfinalCharacterMapequals与==的比较进制相关十六进制十六进制(英文名称:Hexadecimal),是计算机中数据的一种... 查看详情

java学习笔记(代码片段)

Java学习笔记进制相关十六进制十进制转十六进制负数转十六进制八进制二进制快捷使用基本概念VectorfinalCharacterMapequals与==的比较进制相关十六进制十六进制(英文名称:Hexadecimal),是计算机中数据的一种... 查看详情

odoo10学习笔记十六:定时任务

原文地址:http://www.cnblogs.com/ygj0930/p/7154553.html一:定义定时器数据模型模型中定义需要用到的字段、定时方法fromodooimportmodels,fields,api,exceptionsimportloggingfromdatetimeimportdatetime_logger=logging.getLogger(__name__)classs 查看详情