Swift - ожидаемое выражение в списке выражений

Я новичок в Swift, читал, но понятия не имею, что это значит. В строке кода ниже у меня есть «Ожидаемое выражение в списке выражений» после параметров [String]. ТАКЖЕ в тот же момент он ищет разделитель «Ожидаемый», «. Я считаю, что они связаны.

AppDelegate.submitLacunaRequest(module: "empire", method: "login", parameters[String]:["myuserid", "mypassword", "mykey"]) {

            responseObject, error in

            // some network error or programming error

            if error != nil {
                println("error = \(error)")
                println("responseObject = \(responseObject)")
                return
            }

            // network request ok, now see if login was successful

            if let responseDictionary = responseObject as? NSDictionary {
                if let errorDictionary = responseDictionary["error"] as? NSDictionary {
                    println("error logging in (bad userid/password?): \(errorDictionary)")
                } else if let resultDictionary = responseDictionary["result"] as? NSDictionary {
                    println("successfully logged in, refer to resultDictionary for details: \(resultDictionary)")
                } else {
                    println("we should never get here")
                    println("responseObject = \(responseObject)")
                }
            }
        }

Вот соответствующий код из AppDelegate

public func submitLacunaRequest (#module: String, method: String, parameters: AnyObject, completion: (responseObject: AnyObject!, error: NSError!) -> (Void)) -> NSURLSessionTask? {

    let session = NSURLSession.sharedSession()
    let url = NSURL(string: "https://us1.lacunaexpanse.com")?.URLByAppendingPathComponent(module)
    let request = NSMutableURLRequest(URL: url!)
    request.HTTPMethod = "POST"
    request.setValue("application/json-rpc", forHTTPHeaderField: "Content-Type")


    let requestDictionary = [
        "jsonrpc" : "2.0",
        "id"      : 1,
        "method"  : "login",
        "params"  : ["myuserid", "mypassword", "mykey"]
    ]

    var error: NSError?
    let requestBody = NSJSONSerialization.dataWithJSONObject(requestDictionary, options: nil, error: &error)
    if requestBody == nil {
        completion(responseObject: nil, error: error)
        return nil
    }

    request.HTTPBody = requestBody

    let task = session.dataTaskWithRequest(request) {
        data, response, error in

        // handle fundamental network errors (e.g. no connectivity)

        if error != nil {
            completion(responseObject: data, error: error)
            return
        }

        // parse the JSON response

        var parseError: NSError?
        let responseObject = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: &parseError) as? NSDictionary

        if responseObject == nil {

            // because it's not JSON, let's convert it to a string when we report completion (likely HTML or text)

            let responseString = NSString(data: data, encoding: NSUTF8StringEncoding) as String
            completion(responseObject: responseString, error: parseError)
            return
        }

        completion(responseObject: responseObject, error: nil)
    }
    task.resume()

    return task
}

person Number1    schedule 18.02.2015    source источник
comment
Код неполный.   -  person gabbler    schedule 18.02.2015
comment
@gabbler Извините за это. Я думал, что это все, что нужно, чтобы показать проблему   -  person Number1    schedule 18.02.2015
comment
Где вы поместили метод в appledelegate?   -  person gabbler    schedule 18.02.2015
comment
Метод — это просто функция внутри AppDelegate.   -  person Number1    schedule 18.02.2015
comment
Нижеприведенный ответ работает для вас?   -  person gabbler    schedule 18.02.2015


Ответы (3)


Вы используете имя внешнего параметра для параметра при вызове функции, но внешний параметр не определен в объявлении вашей функции. Просто используйте это таким образом.

submitLacunaRequest(module: "empire", "login", ["myuserid", "mypassword", "mykey"]) {

person gabbler    schedule 18.02.2015
comment
Я все еще получаю дополнительный аргумент при вызове - person Number1; 18.02.2015
comment
Вы говорите, что это функция внутри AppDelegate, она не может быть общедоступной внутри класса. - person gabbler; 18.02.2015
comment
Обновил приведенный выше код, но по-прежнему получаю дополнительный аргумент при вызове. Думаю, я следил за всем, но могу ошибаться. - person Number1; 18.02.2015
comment
Вы не должны были делать AppDelegate общедоступным классом, любой класс в swift по умолчанию является внутренним, если вы сами не указываете явный уровень доступа. Обычно вы используете общедоступный доступ при указании общедоступного интерфейса для фреймворка. Теперь, если другой модуль импортировал ваш модуль, его содержимое будет видно другому модулю, поэтому сделайте его внутренним, удалите ключевое слово public и вызовите его, как я сделал в посте. - person gabbler; 18.02.2015
comment
Если вы все еще хотите вызывать метод по-своему, вам придется добавить ключевое слово класса class func submitLacunaRequest, потому что вы вызываете его как функцию класса. - person gabbler; 18.02.2015

Вы неправильно вызываете функцию. Вам не нужен [String] в параметре parameters...

AppDelegate.submitLacunaRequest(module: "empire", method: "login", parameters: ["myuserid", "mypassword", "mykey"]) {
    ...
}
person Ronald Martin    schedule 18.02.2015

Я назвал свой параметр функции protocol. Если бы я попытался использовать это свойство как обычно, я бы заметил, что оно написано розовым цветом как ключевое слово, и переименовал бы его.

Вместо этого я использовал это свойство в такой строке и не получил никаких подсказок от компилятора:

func configure(_ protocol: Protocol, host:String, port:String) {
    urlString = "\(protocol)://\(host):\(port)"
}

Я провожу добрых 5 минут, сбитый с толку этой ошибкой, но потом я понял это. Проблема была в названии параметра.

Я не хотел переименовывать параметр, поэтому написал его так:

urlString = "\(`protocol`)://\(host):\(port)"
person Yaroslav    schedule 03.07.2018