Где использовать функции многократного использования в IOS Swift?
Новое для программирования IOS, но просто интересно, где лучше всего разместить функции, которые я буду использовать во всем моем коде. Например, я хочу написать несколько функций для выполнения запроса POST для веб-службы и возврата словаря. Может быть, еще одна функция для выполнения некоторых вычислений. Лучше всего создать другой файл .swift и поместить туда все мои функции. И что было бы хорошим именем, чтобы дать файл, если так?
public func postRequest() -> [String:String] {
// do a post request and return post data
return ["someData" : "someData"]
}
Ответы
Ответ 1
Лучший способ - создать вспомогательный класс со статическими функциями, например:
class Helper{
static func postRequest() -> [String:String] {
// do a post request and return post data
return ["someData" : "someData"]
}
}
Теперь каждый раз, когда вам нужно использовать postRequest
, вы можете просто так: Helper.postRequest()
Я надеюсь, что это поможет!
Ответ 2
Для многоразовых функций это зависит от того, что я решаю использовать. В этом конкретном случае я использую отдельный файл, потому что публикация в бэкэнд будет более сложной, когда приложение будет развиваться. В моем приложении я использую базовый класс со всеми типами вспомогательных классов:
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
Обычно я создаю отдельный класс, если у меня есть функции, которые будут использоваться несколькими классами, особенно для тех, которые связаны с сетевыми операциями.
Если у вас есть только отдельные функции, которые будут использоваться, вы можете просто создать статические функции внутри этого класса, чтобы они легко доступны для других классов статическим способом:
class DataController {
static func getData() -> [String:String] {
// do some operations
return ["someData" : "someData"]
}
}
let data = DataController.getData() // example
Однако то, что часто имело место для меня (особенно если оно связано с более сложными операциями), состояло в том, что эти сетевые операции потребовали заранее установить начальное соединение или потребовали некоторых начальных настроек, а также выполняли асинхронные операции, которые должны были быть контролируется. Если это так, и вы часто будете называть такие методы, вам может понадобиться создать одноэлементный объект, который вы можете использовать в разных классах и функциях. Таким образом, вы можете выполнить первоначальную настройку или установить начальное соединение только один раз, а затем сделать все остальное по мере необходимости с другими функциями, вместо того чтобы делать их каждый раз, когда функция вызывается.
Создание объекта singleton довольно просто в 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
, но все, что имеет смысл как класс "помощник", будет работать.
Надеюсь, что это поможет:)
Ответ 4
Вы можете создать отдельный класс swift, назовите его WebServicesManager.swift
и напишите все методы, связанные с веб-запросами.
Вы можете использовать методы класса или одноэлементный шаблон для доступа к методам.