余晖落尽暮晚霞,黄昏迟暮远山寻
本站
当前位置:网站首页 > 编程知识 > 正文

swift写类似于OC的interface接口(js interface接口)

xiyangw 2022-12-04 09:58 13 浏览 0 评论

可能是由于是oc转过来的,还是对oc的一些特征念念不忘。当拿到别人封装的的一些功能代码后,又由于时间限制不能细读代码,再碰到有些人controller和service不分开,导致逻辑与功能代码混合一谈,想立刻接入使用发现没有接口说明,甚至没有文档解释传参,甚是头疼。今天谈谈在swift里面怎么实现interface结构,便于别人快速应用。

第一种方法:私有协议充当interface层

swift写类似于OC的interface接口(js interface接口)

//MARK: - 接口描述
private protocol ViewControllerInterface {
// static let share: ViewController 不可用,protocol内若定义单例需要使用static var { get }
 static var shared: ViewController! { get }
 
 /// 静态命名方法
 /// - Parameter name: 
 static func namex(_ name: String)
 
 /// 自定义初始化器
 /// - Parameter name: 
 init(withName name: String?)
 
 /// 自定义初始化器2
 /// - Parameter xxx: 规范
 init(xxx:String?)
 
 /// 实例方法
 func objectFunc()
 
 /// 实例方法2
 func objectFunc2()
}
class ViewController: UIViewController, ViewControllerInterface {
 // 需要实现协议 ViewControllerInterface
}

协议写在前面,这样第三者拿到代码就可以直接使用接口,而且附带接口说明,方便快捷

第二种方法:extension扩展controller层

熟悉Java代码的应该熟悉controller层与service层的区别,引用别人的

DAO层:

DAO层叫数据访问层,全称为data access object,属于一种比较底层,比较基础的操作,具体到对于某个表的增删改查,也就是说某个DAO一定是和数据库的某一张表一一对应的,其中封装了增删改查基本操作,建议DAO只做原子操作,增删改查。

Service层:

Service层叫服务层,被称为服务,粗略的理解就是对一个或多个DAO进行的再次封装,封装成一个服务,所以这里也就不会是一个原子操作了,需要事物控制。

Controler层:

Controler负责请求转发,接受页面过来的参数,传给Service处理,接到返回值,再传给页面。

总结:

个人理解DAO面向表,Service面向业务。后端开发时先数据库设计出所有表,然后对每一张表设计出DAO层,然后根据具体的业务逻辑进一步封装DAO层成一个Service层,对外提供成一个服务。

我们对extension扩展接入controller层,实现尽量少的代码对接

extension ViewControllerC {
 /// convenience init
 /// - Parameters:
 /// - selfName: <#selfName description#>
 /// - value: <#value description#>
 convenience init(_ selfName: String, value: Int) {
 self.init(nibName: selfName, bundle: nil)
 }
 
 /// 实例方法 funcTest1
 func funcTest1() -> Void {
 startFunc1() //大量代码的实现部分交给service层实现,这里尽量简短为了突出接口注重逻辑而不注重业务
 }
}
class ViewControllerC: ViewControllerB {
 //这里实现扩展的service eg. startFunc1()
 func startFunc1() -> Void {
 print("startFunc1")
 }
} 

第三种方法:对遵循协议限定扩展

首先我们声明一个全局协议,比如interfaceProtocol,让所有的viewController都遵守此协议

public protocol interfaceProtocol { }
extension UIViewController: interfaceProtocol { }

比如我想对ViewControllerB声明接口方法

// private extension like interface
extension interfaceProtocol where Self == ViewControllerB {
 /// func1
 /// - Parameter name: <#name description#>
 /// - Returns: <#return value description#>
 func nameFunc1(name: String) -> String {
 return name + "nameTest"
 }
 
 /// class func
 /// - Returns: <#return value description#>
 static func printTest() -> String {
 print("printTest")
 return "printTest"
 }
 
 /// 单例对象
 static var shareVC: ViewControllerB {
 get{
 return ViewControllerB.getShared()
 }
 }
}
class ViewControllerB: UIViewController {
 //这里是具体实现
}

这样貌似跟方法一没什么区别,但是他确实限定了所有的ViewController都要以此形式声明,就像一个规范一样,大家必须这样做,其实更关键的在于协议扩展的思想。对协议进行限定扩展,符合面向协议开发的原则。通过对协议的限定扩展达到像继承那样把簇扩大。但是这里有个问题,我尝试继承的时候,发现子类并不能使用它的扩展方法,

let x = ViewControllerC().nameFunc1(name: "ssss");
// 报错 'ViewControllerC' is not convertible to 'ViewControllerB'

后来查资料是限定扩展方式写错了

// 当对象是ViewControllerB类时有效,不包含其被继承对象
extension interfaceProtocol where Self == ViewControllerB
// 当对象是ViewControllerB类时有效,包含其被继承对象
extension interfaceProtocol where Self: ViewControllerB

所以把之前的限定扩展写成第二种方法就可以了。

这里是别人的一篇关于协议扩展的链接(tt不允许链接外部) https://www.jianshu.com/p/fb1e11dd5ab9

相关推荐

WordPress文章防复制代码(wordpress复制网站)
WordPress文章防复制代码(wordpress复制网站)

酱茄jiangqie.com多人问WordPress文章怎么防止别人复制,今天酱茄小编把代码分享给大家,通过下面的JS代码即可有效的防止别人直接复制你的文章,...

2023-03-21 19:34 xiyangw

iOS9.3再爆新问题:点链接造成应用卡死(应用中打开链接)
iOS9.3再爆新问题:点链接造成应用卡死(应用中打开链接)

北京时间3月30日消息,苹果在一周前正式向用户推送了最新版本的iOS系统,即iOS9.3,但该系统却问题不断。现在新版的iOS9.3又爆出新问题,当点击Sa...

2023-03-21 19:33 xiyangw

google浏览器禁用JavaScript,突破右键复制等限制
google浏览器禁用JavaScript,突破右键复制等限制

按F12进入调试模式,点击“设置”,找到Debugger,勾选DisableJavaScript...

2023-03-21 19:33 xiyangw

ajax的优缺点有哪些(ajax有什么缺点)
ajax的优缺点有哪些(ajax有什么缺点)

什么是ajax?ajax代表异步JavaScript和XML。“异步”一词意味着用户无需等待服务器回复。AJAX不是编程或脚本语言,没有新发明,也没有单独的We...

2023-03-21 19:33 xiyangw

网友发现电脑CPU使用率经常飙升至100%!太意外了
网友发现电脑CPU使用率经常飙升至100%!太意外了

作为全球最大的BT下载网站ThePirateBay(海盗湾)已经不仅仅靠显示广告赚钱了。根据网站TorrentFreak的报道,海盗湾除了提供音乐、影片、软...

2023-03-21 19:32 xiyangw

若用户浏览器禁用JavaScript,谷歌将不再允许其登录

据ZDNet报导,Google昨天宣布了四项用于保护Google账户的新安全功能,不仅用于加强用户登录账户前后的保护,也适用于在受到黑客攻击后恢复的情况。其中一项为:Google使用Jav...

若用户浏览器禁用JavaScript Google将不再允许其登录

PingWest品玩11月1日讯,据ZDNet报导,Google昨天宣布了四项用于保护Google账户的新安全功能,不仅用于加强用户登录账户前后的保护,也适用于在受到黑客攻击后恢复的情况。第一...

干货分享 | JavaScript 基础知识(直播干货分享)
干货分享 | JavaScript 基础知识(直播干货分享)

随着现在技术行业门槛的不断提高,大多数的小伙伴们想要学前端或者是入门前端行业,就必须要掌握一定基础的JavaScript语言知识,本文档将介绍绝大部分常用的...

2023-03-21 19:31 xiyangw

第34节 Web浏览器中的Javascript-零点程序员
第34节 Web浏览器中的Javascript-零点程序员

本内容是《Web前端开发之Javascript视频》的课件,请配合大师哥《Javascript》视频课程学习。JavaScript由最初的一个原始的脚本语言,已...

2023-03-21 19:31 xiyangw

JavaScript ES2019 中的 8 个新功能(javascript 菜鸟教程)
JavaScript ES2019 中的 8 个新功能(javascript 菜鸟教程)

JavaScript一直在不断改进和添加更多新功能。TC39已经完成,并批准了ES2019的8项新功能。这个过程包含了5个阶段:第0阶段:稻...

2023-03-21 19:30 xiyangw

JavaScript 对象可以做到的三件事(在浏览器上运行javascript程序,可以)

除了普通的对象属性赋值和遍历之外,我们还可以使用JavaScript对象执行许多其他操作。在本文中,我们将了解如何使用它们,包括访问内部属性、操作属性描述符和继承只读属性。1.访问内部属性Jav...

冰与火之歌:JavaScript 的困境与挑战(冰与火之舞url)
冰与火之歌:JavaScript 的困境与挑战(冰与火之舞url)

最近几年以来,伴随着各个端平台的迅猛发展,以TypeScript、Swift、Kotlin和Dart为代表的新一代应用编程语言纷纷浮现。群雄环伺之下,J...

2023-03-21 19:30 xiyangw

JavaScript每年更新一个版本,功能越来越强大,能用JS的终将用JS
JavaScript每年更新一个版本,功能越来越强大,能用JS的终将用JS

不做详细功能介绍ES2015(ES6)带来的重大特性Arrowfunctions(箭头函数)PromisesGeneratorslet和const...

2023-03-21 19:30 xiyangw

IT技术分享:浅谈JavaScript作用域(js有哪些作用域,分别是什么意思)
IT技术分享:浅谈JavaScript作用域(js有哪些作用域,分别是什么意思)

javascript是目前web领域中使用非常广泛的语言,不管是在前端还是在后端都能看到它的影子,可以说web从业者不论怎样都绕不开它。在前端领域,各种框架层出...

2023-03-21 19:29 xiyangw

软件测试 | JavaScript如何使用(javascript自动测试框架)

简介JavaScript是脚本语言,是一种轻量级的编程语言,可以插入HTML页面的编程代码。插入HTML页面后,可由所有的现代浏览器执行。作用JavaScript可以直接写入HTML输...

取消回复欢迎 发表评论: