我觉得我过多地复制了代码

时间:2016-01-26 17:51:39

标签: ios swift swift2

我正在使用Swift 2开发iOS应用程序。

我正在努力创建新类来处理离散的功能。

例如,我已经按照这个来引入环境因变量:http://appfoundry.be/blog/2014/07/04/Xcode-Env-Configuration/

我可以使用以下方法获取这些变量:

let path = NSBundle.mainBundle().pathForResource("Configuration", ofType: "plist")
let dict = NSDictionary(contentsOfFile: path!)
url = dict!.objectForKey("envURL") as String

但是我应该在单独的sharedInstance中执行一次该代码,还是应该在需要时编写它?

在我的Configuration.plist中,我有许多不同的键/值对。我需要访问多个ViewControllers中的值,这意味着我可以在5个不同的位置编写这三行。我可以为每个键/值对编写一次,并将结果保存到Singleton的属性中。那会节省线路​​,但这是正确的做法吗?

另一个例子是我在不同的视图控制器中进行了几次相同的REST调用。我应该编写一个新类来处理该调用,然后再使用它吗?

我认为这是由于缺乏面向对象的编程经验,因此任何指针都会非常有用。

由于

3 个答案:

答案 0 :(得分:4)

单例模式不应该是您在类之间共享行为的第一个工具。单身人士有他们的位置,但我发现他们在iOS应用程序中严重过度使用。当你绝对必须强制执行一个且只有一个类的实例时,请使用单例。当你只想让几个对象访问某些共享状态或行为时,避免使用单例作为全局变量(调用+shared___)。

在这种情况下,您有一些您不想重复的配置加载行为。这是一种很好的直觉。我们可以首先将该行为提取到一个结构中,该结构的职责是为您的应用程序配置设置提供一个接口:

struct Configuration {
    static func get(key: String) -> String {
        let path = NSBundle.mainBundle().pathForResource("Configuration", ofType: "plist")
        let dict = NSDictionary(contentsOfFile: path!)
        return dict!.objectForKey(key) as! String
    }
}

现在你的控制器可以通过调用静态方法来加载不同的键:

Configuration.get("envURL")

如果确定需要缓存这些配置值,则可以将此结构切换为具有实例方法的类,并在Configuration实例上维护缓存。然后,每个控制器都可以创建自己的Configuration实例。如果您需要共享一个公共Configuration,您可以在创建它时将其传递给每个视图控制器。

同样适用于您的REST网络呼叫。您可以创建一个类或结构,它提供与此API交互的接口。然后,您的控制器可以根据需要创建和使用此类的实例,或者如果它们需要共享某个状态,则可以传递实例。

答案 1 :(得分:1)

这与该特定示例没有直接关系,但如果您在重用代码时遇到问题,则可能需要查看Swift Extensions。它们是扩展现有类或协议功能的好方法。

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Extensions.html

例如,如果您为restful API使用第三方库,则可以使用管理器上的扩展来定义采用各种端点所需的特定参数的方法。

答案 2 :(得分:0)

  

但是我应该在单独的sharedInstance中执行一次该代码,还是应该在需要时编写它?

如果您发现在同一个班级中多次重复使用同一段代码,请将其分解为一个单独的私人"帮助"方法。如果您在多个类中使用它,您可以编写包含常用实用程序的实用程序类。很多人称这种类/包为公共"

  

另一个例子是我在不同的视图控制器中进行了几次相同的REST调用。我应该编写一个新类来处理该调用,然后再使用它吗?

在处理REST接口时,我喜欢让客户端类与它们进行交互。编写一个类,使您想要对特定REST API进行所有不同的调用。每个调用都可以用不同的方法表示,该方法接受您想要传递给API的所有参数和参数。然后,该方法应反序列化并返回从API接收的值。