Swift_协议、代理(protocol、delegate可选@objc optional与必需、协议扩展、is as? as!检查协议)

本文介绍了Swift中的协议概念,包括协议扩展如何为遵循协议的类型提供默认实现,如何使用is和as? as!操作符检查协议一致性,以及在协议扩展时设置限制条件的用法。

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

ProtocolClass2.swift

//定义协议
@objc protocol ProClassDelegate {
    //代理函数
    func test2() //必需实现
    @objc optional func test(name:String,type:Int)  //可选
}

class ProtocolClass2: NSObject {
    
    //声明类的代理属性变量名
    var delegate:ProClassDelegate?

    func backDelegate() {
        
        //代理回调
        delegate?.test2()
        delegate?.test?(name: "back", type: 0)
    }
    

    

}


ViewController.swift
import UIKit


class ViewController: UIViewController,ProClassDelegate { //遵循代理
    
    
    
    override func viewDidLoad() {
        super.viewDidLoad()

        var proClass:ProtocolClass2? = ProtocolClass2()
        proClass?.delegate = self 
        proClass?.backDelegate()
        
    }

    
    func test2() {
        print("无参数代理回调")
    }
    
    
    func test(name: String, type: Int) {
        print("有参数代理回调")
        print("name = \(name)\n type = \(type)")
    }

}



以下译文

协议扩展

协议可以通过扩展来为遵循协议的类型提供属性、方法以及下标的实现。通过这种方式,你可以基于协议本身来实现这些功能,而无需在每个遵循协议的类型中都重复同样的实现,也无需使用全局函数。

例如,可以扩展 RandomNumberGenerator 协议来提供 randomBool() 方法。该方法使用协议中定义的 random() 方法来返回一个随机的 Bool 值:

extension RandomNumberGenerator {
    func randomBool() -> Bool {
        return random() > 0.5
    }
}

检查协议一致性

你可以使用类型转换中描述的 is 和 as 操作符来检查协议一致性,即是否符合某协议,并且可以转换到指定的协议类型。检查和转换到某个协议类型在语法上和类型的检查和转换完全相同:

  • is 用来检查实例是否符合某个协议,若符合则返回 true,否则返回 false
  • as? 返回一个可选值,当实例符合某个协议时,返回类型为协议类型的可选值,否则返回 nil
  • as! 将实例强制向下转换到某个协议类型,如果强转失败,会引发运行时错误。

为协议扩展添加限制条件

在扩展协议的时候,可以指定一些限制条件,只有遵循协议的类型满足这些限制条件时,才能获得协议扩展提供的默认实现。这些限制条件写在协议名之后,使用 where 子句来描述,正如Where子句中所描述的。

例如,你可以扩展 CollectionType 协议,但是只适用于集合中的元素遵循了 TextRepresentable 协议的情况:

extension Collection where Iterator.Element: TextRepresentable {
    var textualDescription: String {
        let itemsAsText = self.map { $0.textualDescription }
        return "[" + itemsAsText.joined(separator: ", ") + "]"
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值