可能是由于是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