场景:
项目中类名过长,造成不能根据文件名区分出来,并且如果一个模块的类较多时,很难取一个比较优雅的名字。为了使模块名可读, 我们一般的做法就是添加模块前缀。但是如果模块中还有个子模块,如果还继续按这种方法的话,这个文件名就会特别的长。
1. 一级 (Me Module)
MeMainController
MeEditController MeAboutController
2. 两级(Me > Profile Module)
MeProfileChangePasswordController
MeProfileChangeAvatorController
这个时候文件的名字太长就不优雅,想想我们取这么长名字的初衷,无非就是想达到项目中类名 唯一,可读 不冲突的
NameSpace
swift 的namespace ,学过c++, php 的都知道,跟他们的很不一样. Swift 的命名空间是基于 module
而不是在代码中显式地指明,每个 module 代表了 Swift 中的一个命名空间。也就是说,同一个 target 里的类型名称
还是不能相同的。在我们进行 app 开发时,默认添加到 app 的主 target 的内容都是处于同一个命名空间中.
1. 不同target, 这里就不在这里累赘,请参考我下面的参考>命名空间有详细的解释
2. 在通一个项目中,我么如何达到这种namespace的效果
//1. 用struct 包含
//
struct PackageOne {
}
extension PackageOne {
class Class {
var name: String
init(name: String) {
self.name = name
}
}
}
print("\(PackageOne.Class.self)")
let tmp = PackageOne.Class(name: "hell")
print(tmp) // 用class包含
class TestClass {
}
extension TestClass {
class MyClass {
var name: String
init(name: String){
self.name = name
}
}
} let test = TestClass.MyClass(name: "Test")
print(test)
从上面的代码中,启发我们在项目中的具体应用:
1. 对于View
// 项目中运用:
struct MeModule {
struct Views{}
struct ViewControllers{}
} // 这是一个View
extension MeModule.Views {
class Edit: UIView{ }
} extension MeModule.Views {
class Update: UIView { }
}
2. 对于ViewController
// 这是一个Controller
extension MeModule.ViewControllers {
class Edit: UIViewController { }
} extension MeModule.ViewControllers {
class Update: UIViewController { } }
用naspace使得类名唯一 ,上面的两种情形,对于文件夹的组织 我们就会
MeModule>Views>Edit> Edit.Swift
MeModule> Views>Update>Update.swift
MeModule>ViewControllers>Edit>EditController.swift
MeModule>ViewControllers>Update>UpdateController.swift
使得文件唯一。
参考:
1. 命名空间