FSA全栈行动 FSA全栈行动
首页
  • 移动端文章

    • Android
    • iOS
    • Flutter
  • 学习笔记

    • 《Kotlin快速入门进阶》笔记
    • 《Flutter从入门到实战》笔记
    • 《Flutter复习》笔记
前端
后端
  • 学习笔记

    • 《深入浅出设计模式Java版》笔记
  • 逆向
  • 分类
  • 标签
  • 归档
  • LinXunFeng
  • GitLqr

公众号:FSA全栈行动

记录学习过程中的知识
首页
  • 移动端文章

    • Android
    • iOS
    • Flutter
  • 学习笔记

    • 《Kotlin快速入门进阶》笔记
    • 《Flutter从入门到实战》笔记
    • 《Flutter复习》笔记
前端
后端
  • 学习笔记

    • 《深入浅出设计模式Java版》笔记
  • 逆向
  • 分类
  • 标签
  • 归档
  • LinXunFeng
  • GitLqr
  • AndroidUI

  • Android第三方SDK

  • Android混淆

  • Android仓库

  • Android新闻

  • Android系统开发

  • Android源码

  • Android注解AOP

  • Android脚本

  • AndroidTv开发

  • AndroidNDK

  • Android音视频

  • Android热修复

  • Android性能优化

  • Android云游戏

  • Android插件化

  • iOSUI

  • iOS工具

  • iOS底层原理与应用

  • iOS组件化

  • iOS音视频

  • iOS疑难杂症

  • iOS之Swift

    • iOS - Swift 面向协议编程(一)
      • 面向对象开发
      • 面向协议开发
      • 约束
    • iOS - Swift面向协议编程(二)
    • Swift - PropertyWrapper
  • iOS之RxSwift

  • iOS开源项目

  • iOS逆向

  • Flutter开发

  • 移动端
  • iOS之Swift
LinXunFeng
2017-09-12
目录

iOS - Swift 面向协议编程(一)

欢迎关注微信公众号:[FSA全栈行动 👋]

OC无法做到面向协议开发,而Swift可以,因为Swift可以做到协议方法的具体实现,而OC不行

# 面向对象开发

传统的面向对象开发思维方式是将类中实现的相似方法抽取出来,接着放入一个Base类,然后继承于Base类后各个类即可找拥有相同的方法,不用再一个个手动实现。 比如:一个Person类,一个Dog类,它们都拥有方法eat,那么就可以新建一个Animal类,将eat方法抽取出来放入其中,然后将Person类和Dog类都继承于Animal。 但是,如果现在又有一个Robot类,也需要拥有eat方法,而此时也将其继承于Animal的话显然是不合理的,于是我们就需要转换思维,面向协议开发~

# 面向协议开发

面向协议开发的核心是:** 模块化(组件化) ** 我们先来回顾下协议的一般使用,新建一个Swift文件LXFProtocol.swift

import Foundation

protocol LXFProtocol {
    func eat()
}

我们的Person类遵守协议LXFProtocol,需要我们实现协议中的方法,如:

class Person: NSObject, LXFProtocol {
    func eat() {
        //
    }
}

那我们每个类都这样做的话跟直接复制粘贴代码并没什么不同~~ 而开头已经提到一点:

Swift可以做到协议方法的具体实现

那么现在,我们新建一个Swift文件Eatable.swift,以区分LXFProtocol.swift Eatable.swift中的代码实现如下:

import Foundation

protocol Eatable {
    // 可声明变量
}

extension Eatable {
    func eat() {
        // 实现具体的功能
    }
}

有2个注意点

  • protocol中可以声明变量,方便在协议方法中使用
  • 协议方法的具体实现需要在extension中来实现

使Dog类遵守Eatable

class Dog: NSObject, Eatable {

}

这样我们就可以在其它地方轻松调用dog的eat方法,Person类与Robot类也是如法炮制

至此,我们就可以通过面向协议的方式给类定制不同的功能,也就是模块化。可以发现Swift的面向协议编程跟c++的多继承很相似

# 约束

现在的这个Eatable协议是可以被任意遵守的,如果我们有这么个需求,我们创建的协议只是被UIViewController遵守,那我们该怎么做呢? 【当然,Eatable协议只能被UIViewController遵守很扯淡,这里只是举例,不要太在意咯~~】

在 extension 后面加上约束关键字【where】,并注明该协议只能被UIViewController这个类(包括子类)所遵守,而且此时我们还可以拿到遵守该协议的控制器的view

//import Foundation
import UIKit

protocol Eatable {
    
}

extension Eatable where Self : UIViewController {
    func eat() {
        view.backgroundColor = UIColor.red
    }
}

Demo (opens new window) 接下来以一个实际应用来巩固下吧 iOS - Swift 面向协议编程(二)

#iOS#Swift
上次更新: 2025/04/26, 08:01:16
iOS - 记录一次对屏幕旋转后崩溃的定位过程
iOS - Swift面向协议编程(二)

← iOS - 记录一次对屏幕旋转后崩溃的定位过程 iOS - Swift面向协议编程(二)→

最近更新
01
Flutter - Xcode16 还原编译速度
04-05
02
AI - 免费的 Cursor 平替方案
03-30
03
Android - 2025年安卓真的闭源了吗
03-28
更多文章>
Theme by Vdoing | Copyright © 2020-2025 FSA全栈行动
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×