Синтаксис вызова функции

alamofire
xcode
ios
swift3

#1

Привет Ребят! =)
Вопросик по синтаксису вызова функции

Есть функция которая возвращает [String:Any]

func sendPost(apimethod: String , parameters: Dictionary <String, String>, completionHandler :  @escaping ([String:Any]) -> [String:Any])// -> [String:Any]
{
    
    var returnData: [String: Any] = ["":""]
    
    var params = [String: String]()
    params = parameters
    params["api_key"] = globalKey
    Alamofire.request("http://" + globalSite + "/api/method/" + apimethod, method: .post, parameters: params).responseJSON { response in
        
        if let result = response.result.value {
            returnData = (result as? [String:Any])!
            
            completionHandler(returnData)
        }
        
    }

}

Как ее правильно вызвать что бы результат оказался в переменной ? =(

Надеюсь понятно расписал =)

Всем спасибо за внимание =)


#2

Эта функция ничего не возвращает.


#3

Как ни чего не возвращает, если есть completionHandler ? Он и возвращает. Я конечно понимаю что вам насрать на чужой код, вам как я понял лишь бы сказать, не путайте новичков.


#4
func sendPost(apimethod: String , parameters: Dictionary <String, String>, completionHandler: @escaping (Bool, String?) -> ()){
    
    var myData1 = String()
    
    var params = [String: String]()
    params = parameters
    params["api_key"] = globalKey
    
    Alamofire.request("http://" + globalSite + "/api/method/" + apimethod, method: .post, parameters: params).responseJSON { response in
        switch response.result {
        case .success:
            myData1 = "qwe"
            completionHandler(true, myData1)
            
        case .failure:
            completionHandler(false, nil)
        }
    }
}


sendPost(apimethod: apimethod, parameters: parameters) { (succes, data1) in
            if succes {
                print("Success. Data1: \(data1)")
            } else {
                print("Error. Data1: \(data1)")
            }
        }

#5

completionHandler это параметр который вы передаёте в функцию, сама функция sendPost ничего не возвращает.


#6

Может я не так выразился, но по факту при вызове функции sendPost я получаю данные уже за пределами функции, пусть даже через completionHandler, но все равно получаю за пределами функции, грубо говоря функция пусть и не та, но все равно есть возвращаемые значения


#7

попробую ответить…с вопросом.
Вы хотите, чтобы результат выполнения функции был доступен вне функции?
Создайте переменную вне функции и присвойте ей “результат выполнения функции”…


#8

По факту при вызове функции вы передаёте туда замыкание в качестве параметра, в параметре которого вам приходит словарь (во втором варианте Bool, String).


#9

lavteam, писал так
func sendPost(apimethod: String , parameters: Dictionary <String, String>) -> [String:Any]{

    var returnData: [String: Any] = ["":""]
    
    var params = [String: String]()
    params = parameters
    params["api_key"] = globalKey
    Alamofire.request("http://" + globalSite + "/api/method/" + apimethod, method: .post, parameters: params).responseJSON { response in
        
        if let result = response.result.value {
            returnData = (result as? [String:Any])!
            
        }
        
    }
    
    return returnData
}

Так к сожалению не работает, поэтому и создал тему =) я начинающий в swift, но за плечами несколько лет работы в другой сфере =)


#10

haymob, да, замыкания, вот в этом не мог разобраться, сейчас вроде по аналогии написал метод, пока больше непоняток нету, благодарю за внимание =)


#11
import UIKit

class ViewController: UIViewController,,  {
    var boolevoZnachenie: Bool = false
    var stroka: String = ""
    
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        sendPost(apimethod: apimethod, parameters: parameters) { (succes, data1) in
            if succes {
                print("Success. Data1: \(data1)")
                boolevoZnachenie = succes
                stroka = data1
            } else {
                print("Error. Data1: \(data1)")
                boolevoZnachenie = succes
                stroka = data1
            }
        }
    }
    
    func sendPost(apimethod: String , parameters: Dictionary <String, String>, completionHandler: @escaping (Bool, String?) -> ()){
        
        var myData1 = String()
                var params = [String: String]()
        params = parameters
        params["api_key"] = globalKey
                Alamofire.request("http://" + globalSite + "/api/method/" + apimethod, method: .post, parameters: params).responseJSON { response in
            switch response.result {
            case .success:
                myData1 = "qwe"
                completionHandler(true, myData1)
                
            case .failure:
                completionHandler(false, nil)
            }
        }
    }
}

#12

lavTeam, да почти такой же код =)) Меня мучает вопрос - почему на форуме так плохо отвечают на вопросы новичков ? например на мой =)


#13

Есть ли на вашем сайте репозиторий кода ?


#14
  1. Как минимум плохо отвечают из-за вашего сообщение (третье сообщение в этой теме).
    2 .Ваш вопрос не совсем понятен, даже и сейчас лично я не совсем понял, получили ли вы ответ на свой вопрос.
  2. Чем проще вопрос, тем сложней здесь получить ответ, к сожалению.

Почти все разжевано в курсах Ивана. За что ему низкий поклон.
По любым другим вопросам уже есть ответы на stack overflow.
Если там ответа нет, значит не верно сформулирован запрос.
Если не верно сформулирован вопрос - значит и здесь бесполезно спрашивать.

Ваш вопрос - это банальщина, которая чуть ли с первого урока Ивана идет…

Здесь, как я понял, серьезная аудитория, которая охотно помогает решать интересные и интеллектуальные задачи. Вот до такого уровня и желаю и вам и мне и всем дорасти.


#15

Нормально отвечают. Мы не можем мониторить форум постоянно. Вы же хотите получить ответ как можно скорей и сразу. Задайте вопрос и наберитесь терпения, на него ответят, возможно придется уточнить детали вопроса. Как правило, практически все проблемы решаются.

Даже бывали случаи, что половина кода чьего либо приложения писалась форумчанами

Стесняюсь спросить, это вы о чем? Репозитории форумчан у них и хранятся.


#16

на вопросы новичков хренова отвечают, опять же на мой вопрос услышал только насмешки, типа функция ни чего не возвращает, хотя по факту не так… дальше я это высказал… даже привел код…


#17

Но она действительно ничего не возвращает. Когда функция должна вернуть результат, она маркирована вот этим знаком ’ -> Тип ’ и должна содержать return. Так в чем насмешка?


#18

насмешка в том что функция возвращает переменные, через completionHandler


#19

разве что то не так ?


#20

Не стоит везде искать подвох. Тем более от @haymob. У него терпения намного больше чем у меня.

Все правильно, у вас было написано:

Замыкание, это не более чем параметр, переданный в функцию.

Вот небольшой пример для исследования:

final class RealmManager {
  // Вот здесь функция возвращает результат
  static func objects<T: Object>(type: T.Type) -> Results<T>? {
    let realm = try? Realm()
    return realm?.objects(type)
  }
  
  static let manager = RealmManager()
  
  // произвели настройку и подключение БД к серверу (Realm Object Server)
  func setup() {
    SyncUser.logIn(with: credencial, server: authServerURL) { user, error in
      if let user = user {
        Realm.Configuration.defaultConfiguration = Realm.Configuration( syncConfiguration: SyncConfiguration(user:  user, realmURL: realmURL) )
      }
    }
  }
  
  // настроим БД внутри и внутри параметра дадим возможность обращения к нашему объекту
  func connect(block: @escaping (_ realm: Realm)->()) {
    let realm = try! Realm()
    block(realm)
  }
  
}

// после сможем работать с настроенным объектом, который был передан через замыкание
@objc func update(updateBlock: @escaping () -> ()) {
  RealmManager.manager.connect { realm in
    try! realm.write(updateBlock)
  }
}