我正在实施Alamofire Router
。我想为每个API管理我的常量网址。通常我创建一个struct
来存储它们,如下面的代码:
private struct API {
static let foo = "domain/models/foo"
static let bar = "doamin/models/bar"
}
但最近我发现它也可以在String
扩展程序中实现,例如
private extension String {
static let foo = "domain/models/foo"
static let bar = "doamin/models/bar"
}
通过这种方式,我更容易使用它。像
// from
let urlFromStruct: String = API.foo
// to
let urlFromExtension: String = .foo
因为扩展String
意味着常量变为String的静态属性。如果我不省略String
,则代码将变为
let urlFromExtension: String = String.foo
并防止这些常量将在其他文件中访问。我用private来声明扩展名。
所以我想知道是否建议以extension
方式实施它?或任何其他建议表示赞赏。
答案 0 :(得分:4)
不,这不是真的不推荐。即使您存储的值的类型是字符串,这些值与String
类没有逻辑连接,因此在我看来将它们添加为类型属性是个坏主意。
这些API端点仅连接到您的业务逻辑,因此它们应存储在仅与您的业务逻辑相关的类中,而不是存储在泛型类中,即使您将它们声明为私有。
将端点存储在enum
而不是Struct
或Class
中也可能是个好主意。
private enum API {
static let foo = URL(string: "domain/models/foo")!
static let bar = URL(string: "domain/models/bar")!
}
答案 1 :(得分:1)
我宁愿建议您使用枚举,例如:
enum API: String { {
case foo = "domain/models/foo"
case bar = "doamin/models/bar"
}
let urlFromEnum: String = API.foo.rawValue
不建议使用静态字符串扩展String,因为这些是业务属性而不是String属性。
答案 2 :(得分:0)
从语义上讲,将常量添加为const electron = require('electron')
const app = electron.app
const BrowserWindow = electron.BrowserWindow
let mainWindow
app.on('ready', _ => {
mainWindow = new BrowserWindow({
height: 400,
width: 400
})
mainWindow.on('closed', _ => {
console.log('closed')
mainWindow = null
})
})
的fileprivate扩展名有点尴尬,但另一方面,只能使用点符号在整个文件中使用它们比{{1}更自然。例如。
这是Swift似乎没有强烈意见的一个领域。