当前位置: 首页>编程语言>正文

swift写类似于OC的interface接口

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

第一种方法:私有协议充当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


https://www.xamrdz.com/lan/5ab2016398.html

相关文章: