在IOS Swift中放置可重用功能的位置?

时间:2015-06-04 01:15:43

标签: ios swift

IOS编程的新手,但只是想知道在我的代码中放置函数的最佳位置。例如,我想编写一些函数来对Web服务执行POST请求并返回字典。也许是另一个做一些计算的功能。是否最好创建另一个.swift文件并将所有功能放在那里。如果是这样的话,提供文件的好名字是什么?

public func postRequest() -> [String:String] {
     // do a post request and return post data
     return ["someData" : "someData"]
}

5 个答案:

答案 0 :(得分:77)

最好的方法是使用静态函数创建一个辅助类,如下所示:

class Helper{
    static func postRequest() -> [String:String] {
         // do a post request and return post data
         return ["someData" : "someData"]
    }
}

现在,每当您需要使用postRequest时,您都可以这样使用:Helper.postRequest()

我希望能帮到你!

答案 1 :(得分:4)

如果我有多个类使用的函数,我通常创建一个单独的类,特别是涉及网络操作的函数。

如果您只使用将要使用的单独函数,则可以在该类中创建静态函数,以便其他类可以以静态方式轻松访问它:

class DataController {
    static func getData() -> [String:String] {
        // do some operations
        return ["someData" : "someData"]
    }
}

let data = DataController.getData()  // example

然而,对我来说经常出现的情况(特别是如果它涉及更复杂的操作)是这些网络操作需要预先建立初始连接或需要一些初始设置,并且他们还执行需要的异步操作受控。如果是这种情况并且您经常会调用此类方法,则可能需要创建一个可以在不同类和函数中使用的单例对象。这样,您可以进行初始设置或只建立一次初始连接,然后根据需要使用其他函数完成其余操作,而不是每次调用函数时都执行它们。

在Swift中创建单例对象非常简单:

class DataController {
    static let sharedInstance = DataController()  // singleton object

    init() {
        // do initial setup or establish an initial connection
    }

    func getData() -> [String:String] {
        // do some operations
        return ["someData" : "someData"]
    }
}

let data = DataController.sharedInstance.getData()  // example

对于类的名称,我通常将其命名为DataControllerDataHelper,但任何有意义的“助手”类都可以。

希望这会有所帮助:)

答案 2 :(得分:3)

对于可重复使用的功能,它取决于我决定使用的内容。对于这种特定情况,我使用单独的文件,因为当应用程序发展时,发布到后端将变得更加复杂。在我的应用程序中,我使用了一个后端类,包含各种辅助类:

struct BackendError {
    var message : String
}

struct SuccessCall {
    var json : JSON

    var containsError : Bool {
        if let error = json["error"].string {
            return true
        }
        else {
            return false
        }

    }
}

typealias FailureBlock  = (BackendError) -> Void
typealias SuccessBlock  = (SuccessCall) -> Void

typealias AlamoFireRequest = (path: String, method: Alamofire.Method, data: [String:String]) -> Request
typealias GetFunction = (path: String , data: [String : String], failureBlock: FailureBlock, successBlock: SuccessBlock) -> Void

class Backend {
   func getRequestToBackend (token: String )(path: String , data: [String : String], failureBlock: FailureBlock, successBlock: 

}

对于其他情况,我经常在Swift类上使用扩展。就像从数组中获取随机元素一样。

extension Array {
    func sampleItem() -> T {
        let index = Int(arc4random_uniform(UInt32(self.count)))
        return self[index]
    }
}

答案 3 :(得分:1)

您可以创建一个单独的swift类,可以将其命名为WebServicesManager.swift,并在其中编写与Web请求相关的所有方法。

您可以使用类方法或单例模式来访问方法。

答案 4 :(得分:0)

这个非常老的问题,但我想提出几点。 有几个选项,基本上您可以在Swift中编写实用程序功能-

具有静态功能的类。例如

char *

此外,您也可以使用类方法代替静态方法,但是与静态函数不同,这些函数可以被子类覆盖。

class CommonUtility {
      static func someTask() {
      }    
}
// uses
CommonUtility.someTask()

第二,您还可以拥有Global函数,它不是任何类的一部分,并且可以通过名称在应用程序的任何位置进行访问。

class CommonUtility {
      class func someTask() {
      }    
}
// uses
CommonUtility.someTask()

尽管,彼此选择是非常主观的,在这种特殊情况下,我想用func someTask() { } 函数创建类是可以的,在这种情况下,您需要实现联网功能,但是如果您有一些功能只能执行比static函数执行一项任务是一种方法,因为Global函数具有更高的模块化程度,并为单个函数分离出单个任务。

在使用Global函数的情况下,如果我们访问静态成员之一,则会将整个类加载到内存中。但是在使用全局函数的情况下,只有该特定函数会被加载到内存中