之前在swift中在类中定义了一个内嵌类,想要对这个内嵌类进行协议扩展,之前一直都不知怎么写好,后来发现原来是被自己的无知蒙蔽了双眼,系统中有已经有很多这样的写法了.
典型的就是通知
extension Notification.Name {
public static let TestNotificationName = Notification.Name("TestNotificationName")
struct MyOperation {
static let operation1 = Notification.Name("operation1")
}
}
当我想为自己的通知名进行管理式的扩展时,其实就可以写一个Notification.Name的分类,然后在通过内嵌类对不同业务的通知名进行分门别类,便于查找和管理.
所以我老是想下面这样的需求时,反而进入了死胡同,真是可笑.
class Animal {
struct Cell {
}
extension Cell: CustomStringConvertible {
var description: String {
return "cell"
}
}
}
上面的写法是错误的,编译器会报错Declaration is only valid at file scope
于是我经常就这么写了
class Animal {
struct Cell: CustomStringConvertible {
var description: String {
return "cell"
}
}
}
但是一旦我的Cell需要遵守很多协议的时候,那么我就不得不在定义Cell的位置,写一堆继承关系,这样到底是怎么协议实现什么样的方法根本就搞不清楚,业务不明.
于是其实主流的写法就是这样的:
class Animal {
struct Cell {
}
}
extension Animal.Cell: CustomStringConvertible {
var description: String {
return "cell"
}
}
其实第一中错误的写法是我最想表现的,当然第一种方式也会有看不清,不过最后一种算是一种折中的方式,建议按照这样的写法写内嵌类的分类.
网友评论