IOS Swift中的可重用函数放在哪里?

IOS Swift中的可重用函数放在哪里?,ios,swift,Ios,Swift,对IOS编程还不熟悉,但我只是想知道在哪里放置我将在代码中使用的函数是最好的。例如,我想编写一些函数来执行对web服务的POST请求并返回字典。也许另一个函数可以做一些计算。最好创建另一个.swift文件并将我的所有函数放在那里。如果是这样的话,给这个文件起个什么好名字呢 public func postRequest() -> [String:String] { // do a post request and return post data return ["so

对IOS编程还不熟悉,但我只是想知道在哪里放置我将在代码中使用的函数是最好的。例如,我想编写一些函数来执行对web服务的POST请求并返回字典。也许另一个函数可以做一些计算。最好创建另一个.swift文件并将我的所有函数放在那里。如果是这样的话,给这个文件起个什么好名字呢

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

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

class Helper{
    static func postRequest() -> [String:String] {
         // do a post request and return post data
         return ["someData" : "someData"]
    }
}
现在,每次需要使用
postRequest
时,您都可以这样使用:
Helper.postRequest()


我希望这对你有帮助

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

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

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
对于类的名称,我通常将其命名为
DataController
DataHelper
,但是任何作为“helper”类的东西都可以


希望这有帮助:)

对于可重用函数,这取决于我决定使用什么。对于这种特殊情况,我使用一个单独的文件,因为当应用程序发展时,发布到后端将变得更加复杂。在我的应用程序中,我使用一个后端类和各种帮助器类:

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]
    }
}

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


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

这是一个非常老的问题,但我想补充一些要点。 有几个选项,基本上你可以用Swift写你的实用函数-

具有静态函数的类。比如说

class CommonUtility {
      static func someTask() {
      }    
}
// uses
CommonUtility.someTask()
同样,您也可以使用类方法而不是静态方法,但是这些函数可以被子类覆盖,而不是静态函数

class CommonUtility {
      class func someTask() {
      }    
}
// uses
CommonUtility.someTask()
其次,您还可以拥有全局函数,这些函数不是任何类的一部分,可以通过您的应用程序访问任何位置,只需输入名称即可

func someTask() {
} 
但是,选择一个而不是另一个是非常主观的,我认为在这种特殊情况下,创建一个带有
static
函数的类是可以的,您需要实现联网功能,但如果您有一些功能只执行一项任务,而不是
Global
功能,这是一种可行的方法,因为
Global
功能更加模块化,并将单个任务分离出来,以实现单个功能


对于
static
函数,如果我们访问其中一个静态成员,整个类将加载到内存中。但对于全局函数,只有该特定函数将加载到mem中

创建一个单独的swift文件,并将所有此类函数放入该文件中。您可以在整个代码中使用它。谢谢!因此,只需简单地将其命名为Helper.swift就可以了。实践中?我通常有很多Helper,所以我会有AnimationHelper.swift、CoreDataHelper.swift等等,试着打破由它所做的作业分隔的Helper类func postRequest()需要是一个静态func postRequest()才能使用Helper.postRequest()调用它?xCode告诉我是这样的。是的,很抱歉必须这样做,否则您需要创建一个要使用的对象。我更新了帖子谢谢。另外,助手中的另一个类如何调用postRequest()?当它变得静止时,我很难做到这一点?这看起来很酷。您有soe示例应用程序吗?我是个新手,这对我有很大帮助。你能解释一下哪个是静态会员吗?