Swift extension 扩展实用Tips
extension基本功能
Swift扩展是为结构体、类和枚举增加新功能。与OC的分类相似,但是没有扩展名字。
常用于:
- 添加类/实例计算属性
- 添加类/实例方法
- 提供新便携初始化器
- 定义和使用新内嵌类型
- 使现有类型遵循某些协议
- 定义下标
更多的使用extension 可以使您的文件层次化,文件结构更清晰,更加具有面向协议编程效果,后期优化的时候能更方便。
为协议提供默认实现
Swift 定义协议默认都是必须实现,那如果想让某些方法或者属性可选实现怎么办了, 1.使用协议扩展来默认实现,2.使用optional关键字,作为Swift Style 建议选择扩展协议来达到可选功能,而且不需要使用可选链哟。
示例
// 遵守
extension ViewController: SomeOptionProtocol {func methodB() {}func methodC() {}
}
protocol SomeOptionProtocol {func methodA();func methodB();func methodC(); //可选方法
}
extension SomeOptionProtocol {func methodC() {print("提供默认实现")}
}
使用optional实现协议可选(不建议)
extension ViewController: SomeOptionProtocol {func methodA() {}func methodB() {}}@objc protocol SomeOptionProtocol {func methodA(); func methodB();@objc optional func methodC(); // 可选方法
}
给协议添加限制
示例
extension Collection where Iterator.Element: TextRepresentable {var textualDescription: String {let itemsAsText = self.map { $0.textualDescription }return "[" + itemsAsText.joined(separator: ", ") + "]"}
}
区分内部结构层次
当一个Swift文件(比如ViewController)遵守多个不同协议的时候,如果使用扩展遵守协议,能很好的区分文件结构。
如下图
系统类型扩展
通过扩展系统类型达到增加功能和管理作用。
Notification.Name统一管理
传统监听通知或者发送通知,通知名字常常通过字符串初始化,容易引起输入错误,和(监听和发送)增删不同步的问题。可以借助扩展进行通知定义和管理。方便调用。
通知名扩展定义
extension Notification.Name {static let valueChanged = Notification.Name(rawValue: "valueChanged") // 值改变通知static let newValue = Notification.Name(rawValue: "newValue") // 新值通知
}
添加通知监听
private func addNoti() {NotificationCenter.default.addObserver(self, selector: #selector(valueChanged(noti:)), name: .valueChanged, object: nil) // 直接使用点语法// 原始用法, 1.可能存在字符串拼错问题 2.如果注册或者监听通知之一移除,另一个可能不会及时移除。//NotificationCenter.default.addObserver(self, selector: #selector(valueChanged(noti:)), name: NSNotification.Name("valueChanged"), object: nil) }
更优雅的使用Selector
定义Action方法
// MARK: - Action
extension ViewController {@objc fileprivate func button1Tapped(sender: UIButton) {print("点击按钮1")}@objc fileprivate func button2Tapped(sender: UIButton) {print("点击按钮1")}@objc fileprivate func button3Tapped(sender: UIButton) {print("点击按钮1")}@objc fileprivate func button4Tapped(sender: UIButton) {print("点击按钮1")}
}
扩展Selector
// MARK: - Selector
fileprivate extension Selector { // 为了只在文件内访问,添加fileprivatestatic let button1Tapped = #selector(ViewController.button1Tapped(sender:)) // 通过静态变量添加static let button2Tapped = #selector(ViewController.button1Tapped(sender:))static let button3Tapped = #selector(ViewController.button1Tapped(sender:))static let button4Tapped = #selector(ViewController.button1Tapped(sender:))}
直接通过.语法调用
/// 设置按钮private func setupButtons() {let button1 = UIButton(type: .custom)button1.addTarget(self, action: .button1Tapped, for: .touchUpInside) // 点语法调用//button1.addTarget(self, action: #selector(button1Tapped(sender:)), for: .touchUpInside) // 原始语法//依次为buttons添加target}
警告:该Selector扩展适合文件内有多个Selector方法时使用,毕竟需要增加多余定义代码, 建议添加权限控制,
Swift extension 扩展实用Tips相关推荐
- swift 字符串转int_Swift Tips Streamline 如何假装写过 Swift
作者 Nemocdz,腾讯 iOS 工程师.这篇文章转载至他的博客,可以点击阅读原文来查看他的博客.本文总结了笔者日常使用 Swift 的一些小 Tips. 文章较长,预计阅读时间 15分钟 Safe ...
- 【Android Gradle 插件】Extension 扩展类型 ( Module 引入插件类型 | application 插件 | library 插件 | Variants 变体列表 )
文章目录 一.Module 引入插件类型 1.com.android.application 插件 2.com.android.library 插件 二.Extension 扩展类型 三.applic ...
- Unity Cinemachine智能相机教程(五):VirtualCamera的Extension扩展
摘要:[长文预警,先收藏后品尝]如何让相机更智能呢?Extension扩展可以给虚拟相机带来无限的可能. 洪流学堂,让你快人几步.你好,我是跟着大智(VX: zhz11235)学Unity的萌新,我叫 ...
- Safari Extension 扩展插件中关于权限的二三事(例如设置权限、权限类型等)
Safari Extension 扩展插件的权限相关的内容大致分为下面几个方面: 用户要掌控扩展(Users are in control) Safari Extension 扩展插件是要在用户控制下 ...
- Category(分类/类目)、Protocol(协议)、Extension(扩展/延展)
Category(分类/类目): 利用Objective-C的动态运行时分配机制,Category提供了一种比继承更为简洁的方法来对class进行扩展,无需创建对象类的子类就能为现有的类添加新方法,可 ...
- PostgreSQL编写记录删除表格信息的Extension扩展
摘要:因为作者水平有限,暂且只是测试Extension扩展用例, 一个典型的extension包含多个SQL对象.举个例子,如果我们创建一个新的数据类型(data type),那可能同时还需要与之相关 ...
- swift为UIView添加extension扩展frame
添加swift file:UIView+Extension import UIKitextension UIView {// x var x : CGFloat {get {return frame. ...
- swift_027(Swift 的扩展)
//***********swift学习之27--扩展--*************************** /* 扩展跟OC一样就是向一个已有的类.结构体或枚举类型添加新功能. 只能添加新的功能 ...
- Swift类扩展使用方法
2019独角兽企业重金招聘Python工程师标准>>> Swift是没有OC中的分类的. 但可以进行类扩展, 一般用于实现代理方法. 类扩展中无法定义属性 使用方法: extensi ...
最新文章
- PHP如何通过Http Post请求发送Json对象数据?
- 嵌入式linux------ffmpeg移植 解码H264(am335x解码H264到yuv420并通过SDL显示)
- html不支持ie7,解决IE6/IE7/IE8不支持before,after问题
- autojs 云控_autojs websocket 核心示例代码,云控技术
- @RequiresPermissionss是否可以填写多种权限标识,只要满足其一就可以访问?
- hashmap是有序还是无序_说实话,你要是看完这篇 HashMap ,和面试官扯皮真的就没问题了!
- Java泛型(类、接口、方法)及通配符
- python是什么意思-python是什么意思
- [转载] python定义整型常量_Python笔记——数据类型、变量和常量
- MacOS实现MSDOS格式化为NTFS文件系统
- 41. 流感传染(宽搜)
- cad剖切线的快捷键_CAD快捷键记不住怎么办?顶级绘图员教你,从此不求人
- 最新遇到的产品经理面试题
- MySQL数据库之分库分表方案
- LOTO课6:一只三极管的输出特性曲线的测绘
- 嵌入式系统开发-麦子学院(11)——ARM Cortex A8 硬件基础(1)
- 【软件工程】决策表和决策树
- Leetcode之Non-decreasing Array 问题
- 搭配Online:瑞幸昔日“盟友”神州优车,与北汽集团达成战略合作
- Graccvs文件正文提取开发组件--文件内容搜索的利器