首页 > 其他分享 >22:swift-协议

22:swift-协议

时间:2023-03-13 09:37:00浏览次数:29  
标签:协议 22 初始化 方法 random func var swift

 

 

正文

 

/* 22:协议
 1: 协议为方法、属性、以及其他特定的任务需求或功能定义蓝图。
    协议可被类、结构体、或枚举类型采纳以提供所需功能的具体实现。
    满足了协议中需求的任意类型都叫做遵循了该协议。
 
 */

import UIKit


/*
 2:定义属性
     2.1: 属性要求定义为变量属性,在名称前面使用 var 关键字。
     2.2: 协议同时要求一个属性必须明确是  可读的  或  可读的和可写的。
     2.3: 在协议中定义类型属性时在前面添加 static 关键字。
 */
protocol SomeProtocol {
    var mustBeSettable: Int { get set }
    var doesNotNeedToBeSettable: Int { get }
    // 类型属性
    static var someTypeProperty: Int { get set }
}

/* 3: 方法要求
    协议可以要求采纳的类型实现指定的实例方法和类方法。
    这些方法作为协议定义的一部分,书写方式与正常实例和类方法的方式完全相同,但是不需要大括号和方法的主体。
 */
protocol RandomNumberGenerator {
    func random() -> Double
}

/* 4:异变方法要求  结构体和枚举 mutating
    有时一个方法需要改变(或异变)其所属的实例。
    例如值类型的实例方法(即结构体或枚举),
    在方法的 func 关键字之前使用 mutating 关键字,来表示在该方法可以改变其所属的实例,以及该实例的所有属性。
 */
protocol Togglable {
    mutating func toggle()
}

/* 5: 初始化器要求
     协议可以要求遵循协议的类型实现指定的初始化器。和一般的初始化器一样,只用将初始化器写在协议的定义当中,只是不用写大括号也就是初始化器的实体:
     
     你可以通过实现指定初始化器或便捷初始化器来使遵循该协议的类满足协议的初始化器要求。
     在这两种情况下,你都必须使用 required 关键字修饰初始化器的实现:
 
    由于 final 的类不会有子类,如果协议初始化器实现的类使用了 final 标记,
    你就不需要使用 required 来修饰了。因为这样的类不能被继承子类。
  */
protocol InitProtocol {
    init(someParameter: Int)
}

/* 6:使用扩展声明采纳协议
 
 */



class Protocol22VC: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = .white
        self.title = "22:协议"
        
        // 协议,
        let generator = LinearCongruentialGenerator()
        print("Here's a random number: \(generator.random())")
        // Prints "Here's a random number: 0.37464991998171"
        print("And another one: \(generator.random())")
        // Prints "And another one: 0.729023776863283"
        
        // 异变方法
        var lightSwitch = OnOffSwitch.off
        lightSwitch.toggle()
        print("结构体异变方法协议:\(lightSwitch)")
        
        // 初始化协议
        let classA = ClassA(someParameter: 1)
    }
}


class LinearCongruentialGenerator: RandomNumberGenerator {
    var lastRandom = 42.0
    let m = 139968.0
    let a = 3877.0
    let c = 29573.0
    
    func random() -> Double {
        lastRandom = ((lastRandom * a + c).truncatingRemainder(dividingBy:m))
        return lastRandom / m
    }
}

// 开关结构体
enum OnOffSwitch: Togglable {
    case off, on
    mutating func toggle() {
        switch self {
        case .off:
            self = .on
        case .on:
            self = .off
        }
    }
}

class ClassA: InitProtocol {
    // 你可以通过实现指定初始化器或便捷初始化器来使遵循该协议的类满足协议的初始化器要求。在这两种情况下,你都必须使用 required 关键字修饰初始化器的实现:
    required init(someParameter: Int) {
        print("初始化协议:\(someParameter)")
    }
}

 

标签:协议,22,初始化,方法,random,func,var,swift
From: https://www.cnblogs.com/zyzmlc/p/17210243.html

相关文章

  • 流量分析九之HTTP协议
    HTTP协议超文本传输协议(HyperTextTransferProtocol,HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议,是因特网上应用最为广泛的一种网络传输协议,所有的WWW文......
  • 2022.3.12周报
    本周总结:刷了洛谷一些字符串蓝题紫题大方向:字符串小专题:后缀自动机、trie树题目完成情况:16 ......
  • JPEG编码协议--压缩数据格式
    接上篇学习了JPEG的编码原理,本篇学习JPEG文件压缩数据格式,文章内容主要来自ITU-t81标准,加之个人的理解说明。一、文件结构  JPEG文件使用JFIF格式作为交换格式标准。......
  • 如何在本机上面通过IP访问sql server2022数据库
    SQLSERVER2022为了能用IP地址或者local登陆,需要做下面的配置。1、打开SQLServer2022配置管理器。右键点击SQLServer(SQLEXPRESS)正在运行的那个,”属性“,在弹出的窗......
  • keydb redis 兼容协议服务
    keydb是完全兼容redis协议的服务,同时支持了不少其他特性,比如多主,多复制,对于我们的集群环境部署简化了不少而且还有一个不错的优势是性能(利用了多线程提供了不错的性能)官......
  • Ubuntu22.04下解决终端无法打开vscode
    一般来说,有时为了方便会直接在Ubuntu终端登陆root账户获取权限在root下打开vscode会提示无法打开。环境:Ubuntu22.04解决办法:终端输入:vi~/.bashrc添加一行:aliascod......
  • Visual Studio 2022 直接运行调试 Godot4 C# 项目
    https://94zl.com/1在Godot创建任意C#脚本文件2在Godot中构筑项目3VS打开你刚才构筑的项目,编辑.csproj文件(直接点一下解决方案里的C#项目会自动打开).加......
  • P1122 最大子树和
    P1122最大子树和-洛谷|计算机科学教育新生态(luogu.com.cn)题目就是要求:树上点权之和最大的一个连通分量令dp[i]为必须选i节点的情况下,最大的子树点权和则有转移......
  • 流量分析七之TCP协议
    TCP协议传输控制协议(TransmissionControlProtocol),位于TCP/IP模型的传输层,它是一种面向连接的,基于字节流的端到端协议,可以为主机提供可靠的数据传输。TCP报文格式......
  • CSP-J/S2022游记(寄)
    Day-29国庆假期开始了,跟clq大佬一起准备29号的复赛Day-23这个国庆每天早上89点去机房下午56点回家,前面五天做了不少题后面两天就开始摆烂了(写作业去了)也重新把自己......