是否建议在“扩展字符串”中存储常量字符串

时间:2017-07-24 15:46:51

标签: swift alamofire

我正在实施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方式实施它?或任何其他建议表示赞赏。

3 个答案:

答案 0 :(得分:4)

不,这不是真的不推荐。即使您存储的值的类型是字符串,这些值与String类没有逻辑连接,因此在我看来将它们添加为类型属性是个坏主意。

这些API端点仅连接到您的业务逻辑,因此它们应存储在仅与您的业务逻辑相关的类中,而不是存储在泛型类中,即使您将它们声明为私有。

将端点存储在enum而不是StructClass中也可能是个好主意。

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似乎没有强烈意见的一个领域。