首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何避免使用子类化和/或委托模式为两个视图控制器编写相同的函数(Swift)

在Swift中,可以通过使用协议和扩展来避免为两个视图控制器编写相同的函数,而不需要使用子类化或委托模式。

  1. 创建一个协议,定义需要共享的函数:protocol SharedFunctionality { func commonFunction() }
  2. 在需要共享函数的视图控制器中,遵循该协议并实现函数:class ViewController1: UIViewController, SharedFunctionality { func commonFunction() { // 实现共享函数的逻辑 } }
  3. 在另一个视图控制器中,同样遵循该协议并实现函数:class ViewController2: UIViewController, SharedFunctionality { func commonFunction() { // 实现共享函数的逻辑 } }
  4. 创建一个扩展,实现共享函数的默认实现:extension SharedFunctionality { func commonFunction() { // 默认实现的逻辑 } }

这样,两个视图控制器都可以通过遵循协议来共享相同的函数,而无需子类化或使用委托模式。如果需要自定义特定视图控制器的函数实现,可以在该视图控制器中重写该函数。

这种方法的优势是可以避免代码重复,提高代码的可维护性和可扩展性。同时,通过使用协议和扩展,可以更好地组织代码,使其更具可读性和可理解性。

在腾讯云的产品中,可以使用云函数 SCF(Serverless Cloud Function)来实现类似的功能。云函数是一种无服务器计算服务,可以让您以函数的方式编写和运行代码,无需关心服务器的管理和维护。您可以将共享函数的逻辑编写为一个云函数,并在不同的视图控制器中调用该云函数,以实现代码的共享和复用。

腾讯云云函数产品介绍链接地址:https://cloud.tencent.com/product/scf

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Swift:静态工厂方法

swift: 静态工厂方法 视图 Views 视图是我们在编写UI代码时必须设置最常见对象之一。...虽然我们可能无法完全摆脱视图控制器(或与此相关视图类化,但是某些类型视图控制器可以从工厂方法中受益。...尤其是在使用视图控制器时,我们通常最终会得到一组视图控制器,它们只能在其中呈现特定状态,而不是在其中包含大量逻辑。对于那些视图控制器,将其设置移动到静态工厂API可能是一个很好解决方案。...特别是如果与"Swift:将视图控制器用作插件" 中便捷API稍加修改版本结合使用,我们现在可以在执行异步操作时轻松添加预先配置加载视图控制器: class ProductListViewController...如果您想了解有关此类对象以及我通常使用工厂模式其他方式更多信息,请查看"Swift使用工厂模式避免共享状态","Swift使用工厂进行依赖注入""Swift: 使用懒加载属性"。

2.4K10

平面检测-搜索真实世界表面

ARSCNViewDelegate是一种协议,它包含许多方法来帮助跟踪摄像机视图对象。方法就像程序例程来实现某些东西。 在编程中,委托是一种设计模式,允许类将其职责委托给另一个对象。...sceneView.delegate = self 一旦执行了任务,代表就会将信息报告回场景视图。 为了更多地了解Swift委派,我邀请您访问查看本书第4章中委托部分。...否则,返回退出方法。运行该应用程序以测试它。 返回委托文件,planeAnchor声明一个常量。我们将使用它作为锚点来放置对象。 let planeAnchor = anchor as!...不要担心,我们将继续编写代码并在最后添加缺少返回值。 平面几何 在此函数中,我们将为节点设置几何,并且该几何是平面。因此,使用其范围属性创建一个大小planeAnchor平面。...公式图表 重构控制流程 在我们继续之前,我想重构if else语句。有一种更好方式来编写它。我想从这种方式开始,使其更容易理解。另一种选择是使用guard语句。

2.9K30
  • 窥探Swift之协议(Protocol)委托代理(Delegate)回调使用

    协议与委托代理回调在之前博客中也是经常提到用到在《Objective-C中委托(代理)模式《iOS开发之窥探UICollectionViewController(四) --一款功能强大自定义瀑布流...论InterfaceProtocol功能来说,两者也是大同小异。   今天就结合两个实例来窥探一下Swift协议与Delegate回调(委托代理回调)。...上面使用委托回调主要是使用Swift协议(Protocol)来实现。那么如何使用协议来实现你自己委托回调呢?这将是下面将要介绍内容。   二....我们需要做就是,在上面界面中,我们点击任意Cell就可以Push(导航控制器展示视图控制器一种方式,可以理解视图控制器压栈过程)到一个ViewController中,这个ViewController...上面实例意思就是把下一个页面的值通过委托代理回调形式传到上个页面中去,在前面的博客《窥探Swift函数与闭包应用实例》中也做了同样事情,不过之前我们是使用闭包(Closure)回调来实现

    3.5K80

    Swift 项目 - Xib | StoryBoard 多人协作技巧

    那么反过来说,如何使用Storyboard才不算滥用? 避免滥用,最好方法就是定制规范,就好像代码中诸多规范一样。...,应该像MVP模式那样,每个页面都有独立Storyboard,每个Storyboard只应该有一个主VC同页VC,主VC不应存在2个以上。...对于圆角,背景色,阴影等CALayer样式,应该使用扩展类化实例形式,使用@IBInspectable属性关键字,在Storyboard属性面板中设定初始样式。...与其说StoryBoard Xib 隐藏了UI细节,倒不如说苹果是希望通过他们来引导开发者正确使用 视图 控制器 ,他们创建视图实例时候都是通过 required init?...一个占位容器视图指向控制器Embed Segue 按住Control键连线到想要包含控制器,占位视图实例==控制器view(控制器视图) 选择Embed连线方式后,控制器 尺寸变化成跟占位视图一样尺寸

    2.1K20

    Swift 代理模式

    Swift代理模式 Objective-C 除了语法外,几乎一样。...Objective-C 代理模式 在介绍 Swift 代理模式前,先来看回顾一下 Objective-C 中代理模式如何实现 Objective-C 中用代理实现反向传值: 委托方(控制器委托方需要实现...创建协议 、声明协议方法 创建一个代理属性 执行协议方法 代理方(主控制器) 代理方需要实现 遵守(继承)协议 将代理设为自己 实现代理方法 Swift 代理模式 Swift 代理模式 与 Objective-C...Swift 中用代理实现反向传值: 委托方(控制器) 创建协议 、声明协议方法 创建一个代理属性 执行协议方法 代理方(主控制器) 继承协议 将代理设为自己 实现代理方法 总结 对比可以方法 Swift...代理模式 与 Objective-C 用法完全相同,只是语法发生了变化。

    50010

    Swift 5.6到5.10新特性整理

    actor class 类型之间这种差异原因是 actor 不支持继承,因此它们可以去掉类初始化器委托复杂性。GAIT 使用与普通类相同语法形式来定义委托初始化器。...GAIT 使用与普通类相同语法形式来定义委托初始化器。...在你 Package.swift 文件中添加宏模块。 在你主目标中声明宏。 使用宏。 使用宏: 允许创建复杂且动态代码转换。 可以提高开发效率,因为你可以避免编写重复复杂手动代码。...使用原始 withTaskGroup() API 时,可能会出现一个问题,因为 Swift 只在我们调用 next() 遍历任务组任务时才丢弃子任务及其结果数据。...所以,我们可以创建一个新结果构建器,它知道如何接受一个视图,以及如何将该视图与另一个视图组合: @resultBuilder struct SimpleViewBuilderNew { static

    2K11

    2019最新iOS面试题及答案

    面向对象编程中,java已经归纳了23种设计模式。 mvc设计模式 :模型,视图控制器,可以将整个应用程序在思想上分成三大块,对应是的数据存储处理,前台显示,业务逻辑控制。...我觉得最好也最简单一个列子就是tableView中图片加载显示了。一个延时载,避免内存过高,一个异步加载,避免线程堵塞。 33. 是否在一个视图控制器中嵌入两个tableview控制器?...使用block使用delegate完成委托模式有什么优点?...首先要了解什么是委托模式委托模式在iOS中大量应用,其在设计模式中是适配器模式对象适配器,Objective-C中使用id类型指向一切对象,使委托模式更为简洁。...了解委托模式细节: iOS设计模式—-委托模式 使用block实现委托模式,其优点是回调block代码块定义在委托对象函数内部,使代码更为紧凑; 适配对象不再需要实现具体某个protocol,代码更为简洁

    2.3K20

    添加多个屏幕-创建格线布局

    您可以下载Final Xcode项目,以帮助您与自己进度进行比较。 查看控制器 在主故事板中,让我们构建我们集合视图。首先,把视图控制器从对象库旁边我们视图控制器。...在第二个视图控制器和约束内插入一个UIView:0左,0右0底(全部相对于superview)。取消选中“ 约束”到边距并将高度设置380。 ?...使用Command + R运行代码,然后修复2个错误。它将为您提供运行CollectionView所需两种方法。 Sections中项数 Cell 在第一个函数内部,我们只需返回3。...return 3 在cells函数内,cell声明一个常量,然后调用CollectionView,它cell路径。然后,将cell返回。...使用segue名称声明一个if语句。这样,您确定在调用此segue时,我们将执行操作。将委托设置self。我们需要使用委托来指定我们正在调用,否则,View Controller不知道。

    2.9K40

    【IOS开发基础系列】UIScrollView专题

    某些对象是用来管理内容显示如何绘制,这些对象应该是管理如何平铺显示内容视图,以便于没有视图可以超过屏幕尺寸。就是当用户滚动时,这些对象应该恰当增加或者移除视图。          ...假如你设置canCancelContentTouchesYES,那么当你在UIScrollView上面放置任何视图时候,当你在视图上移动手指时候,UIScrollView会给视图发送touchCancel...,在那你只在意一个视图控制,但你想在不同地方重复使用滚轴视图,如果你必须每个都子类化,你最后会有很多不同滚轴视图子类以及在视图特定应用逻辑。        ...编写很多子类是很沉闷事情,你最后会有很多无法重复使用单独视图,而MVC视图部分一个重点是视图是可以在不同控制器不同模式之中重复使用,如果我们把所有逻辑都放在视图中,它减少了可复用性。        ...它在这些对象之间保持了松散配对,视图本身与视图控制器任何其它控制器对象,委托不是滚轴视图直接子类,它比起牢固配对子类更加松散。

    57930

    IOS 与ANDROID框架及应用开发模式对照一

    视图控制器对象提供基础结构,来管理内容相关视图并协调视图显示与隐藏。视图控制器还用来管理应用程序视图层次结构。...应用程序通过串联图nib资源文件载入视图控制器相关视图。串联图nib资源文件含有视图视图控制器,应用程序通过它们,将内容呈如今屏幕上。 串联图中视图。是依据显示它们视图控制器来组织。...通过直接将 UIView(子类)子类化。您还能够定义自己自定视图。 除了包含视图控制以外,应用程序还能够将 Core Animation 层并入其视图控制分层结构中。...UIKit 框架提供视图组织视图层次。应用程序所显示视图,会排列成层次结构(直观上基于包括)。此模式同意应用程序将单个视图和合成视图同等对待。...层次根部一个窗体对象;根部下面的每一个视图,都有一个父视图,以及零个多个子视图。 父视图包括视图视图层次是画图事件处理结构性组件。

    1.1K20

    成为一名优秀 Swift 开发人员 10 个小技巧

    幸运是,我有一位 UI/UX 专家与我一起工作,我提供了很多有关如何正确操作建议。...在开发文档中,通知是在控制器与模型服务之间实施通信可同步模式正确方法,我在项目中经常使用 Notification Center,基本上实现了观察者模式,并让应用程序带有更多响应式元素。...一个重要建议是:需要在 deinit viewWillDisappear 方法中删除未使用不必要观察者,以避免内容泄漏重载。 10....只需要将所有 UIButton 连接到相同 @IBAction,然后使用发送方找出触发了该事件中哪一个,并为该特定行为编写正确实现即可。...此外,在 UI 元素上使用 tag 来标识它们,而不是使用其标题其它内容来区分。 结论 我没有提到所有基本 OOP 原则。显然,您必须以正确方式实现类,封装,抽象设计模式

    2.3K40

    面试iOS 机会在自己手中

    2、模式改变。主线程 RunLoop 里有两个预置 Mode:kCFRunLoopDefaultMode UITrackingRunLoopMode。...从个人使用感觉来看,比较合适用法是:除了依赖关系尽量使用GCD,因为苹果专门GCD做了性能上面的优化。 17. 如何访问并修改一个类私有属性?...Mode,如果要让任何情况下都回调,则需要设置ModeCommon模式; 实质上,对于线程runloop默认是不存在,因为苹果采用了懒加载方式。...7). viewWillLayoutSubviews:视图控制器view将要更新内容视图位置。 8). viewDidLayoutSubviews:视图控制器view已经更新视图位置。...11). viewDidDisappear:视图控制器view已经从window上消失。 31. 如何用GCD同步若干个异步调用?

    54351

    Swift使用工厂进行依赖注入

    = factory.makeMessageViewController(for: message) 就像我们在 "使用工厂模式避免Swift共享状态 "中看到那样,我非常喜欢工厂一点是,它可以让你完全解耦对象使用创建...这使得许多对象与它们依赖关系更加松散,这在你想要重构改变事物情况下非常有帮助。 那么,我们如何才能使上述情况发生呢?...我们将首先为我们工厂定义一个协议,这将使我们能够轻松地创建我们应用程序中需要任何视图控制器,而不需要实际了解其依赖性初始化器。...我们还将创建额外工厂协议来创建我们视图控制器依赖关系,比如这个,让我们我们列表视图控制器创建一个MessageLoader: protocol MessageLoaderFactory {...由于我们已经将所有的工厂定义协议,我们可以通过实现任何给定工厂协议特定测试版本,在测试中轻松地模拟它们。我将在未来博文中写更多关于模拟如何在测试中充分利用依赖注入内容。 你怎么看?

    83120

    架构之路 (七) —— iOS AppSOLID原则(一)

    DailyExpensesView.swift MonthlyExpensesView.swift 也是如此。除了使用报表数据源类之外,它们也相同。...您将创建一个抽象类,而不是创建一个具体实现符合协议,更具体实现需要子类化该抽象类。 它实现了相同目标:您可以轻松地交换底层实现,而无需更改任何视图。...这不仅可以让您删除在此处编写代码,还可以让您轻松地测试中视图提供模拟数据源。 构建并运行。 您会发现一切仍然完好无损,预览现在会显示您模拟费用。...两种方法之间明显区别是: ExpensesView 负责通知 AddExpenseView如何执行保存。 如果修改要保存字段,则需要将此更改传播到两个视图。...编写干净且有组织代码是一个总能得到回报目标。如果你说,“我稍后会清理它”,当那个时刻到来时,事情通常会太复杂而无法真正清理。 在代码中使用设计模式看似复杂问题提供了简单解决方案。

    4.7K10

    iOSMVC框架之控制层构建(上)

    而且这种设计还有如下更多考量: 视图界面千变万化,会根据用户体验不停升级优化,甚至同一个功能前后两个版本都有完全不同差异,或者某些视图界面会分散到其他视图界面中去,又原来分散视图界面又聚合到某个新视图界面中来...为了实现这些能力,控制器中采用了一种模板方法设计模式来解决这个问题。这里面我主要想介绍一下iOS视图控制器解决这些问题而所做实现。...上面借助辅助类来实现方法可以解决我们派生类中代码重复问题。上面的方法缺点就是我们派生类中需要编写很多重复、程式化代码。如何来精简呢?...如何合理定义以及放置属性,如何合理控制器方法进行分类,以及在何时创建视图、在何时创建业务对象,在何时添加销毁观察者,在类析构中作如何处理等等这些其实都是有一定规则规范。...另外有可能我们控件会采用懒加载模式来实现根视图中子视图建立,因此如果你用strong的话就有可能导致视图不会被重新构建。 对于NSString类型属性来说我们最好将他声明为copy。

    1.6K20

    委托与回调函数

    这里其实使用了一个同样稀疏平常却广为流传设计模式——delegate模式。Delegate模式是在Cocoa开发中随处可见一种设计模式,几乎贯穿于整个Cocoa框架。...至于回调函数么,其实跟委托没什么关系,然而曾经年少无知我对这两个概念十分模糊,我想可能现在也有很多同学感到一头雾水,所以今天我想针对委托模式回调函数分别讲一讲自己理解,如有疏漏,欢迎各位批评指正。...这是一种良好解耦,非常适合在框架中使用委托说完了,那什么是回调函数呢?其实回调函数事情跟委托很类似。...不同是,回调函数通过传递函数来实现延迟定义操作(在C这样过程式语言中,需要通过函数指针作为参数传递来调用函数,而在支持高阶函数函数式语言中,可以直接以函数参数传递进行操作)。...Swift函数式编程支持非常到位,所以可以轻松编写回调函数

    1.7K30

    流畅 Python 第二版(GPT 重译)(七)

    在 Django 中,列表视图详细视图被设计一起解决这个问题:列表视图呈现搜索结果,详细视图为每个单独项目生成一个页面。 然而,最初通用视图函数,因此它们是不可扩展。...许多人以一种有限方式使用它们,作为不透明盒子,但当需要创建新东西时,许多 Django 程序员继续编写处理所有这些责任单片视图函数,而不是尝试重用基本视图混合类。...由于代码更多地被阅读而不是被编写,一般情况下应避免类化,尤其不要混合各种类型继承,并且不要使用类化进行代码共享。...现在比以往任何时候都更时尚地避免继承,所以这里有两个关于如何做到这一点参考资料。Brandon Rhodes 写了 “组合优于继承原则”,这是他出色 Python 设计模式 指南一部分。...Fackler Manista 谈到围绕接口处理实现这些接口对象函数来组织系统,避免继承紧密耦合失败模式。这让我很想起 Go 方式,但他们 Python 提倡这种方式。

    19110
    领券