Swift контекстный тип любой не может использоваться с литералом массива

Я пытаюсь создать новый класс с параметрами для запросов, и я получаю сообщение об ошибке:

contextual type any cannot be used with array literal

Я попытался добавить as Any в конец, но это не сработает.

class JsonParams {
    let userName = "root"
    let password = "admin01"

    static let param: [String: Any] = [
        "jsonrpc": "2.0",
        "id": 1,
        "method": "call",
        "params": [
            "00000000000000000000000000000000",
            "session",
            "login",
            [ "username": userName, "password": password]
        ]
    ]
}

EDIT:

Теперь мне нужно отправить имя пользователя и пароль в param из поля имени пользователя после того, как кто-то его напечатает, поэтому я хочу создать метод для param,

class JsonParams {

let userName = "root"
let password = "admin01"
var param = [String: Any]()
func log (username.text, password.text){
init() {
    let param : [String: Any] = ["jsonrpc": "2.0", "id": 1, "method": "call", "params": [ "00000000000000000000000000000000", "session", "login", [ "username": username.text, "password": password.text]]]
    self.param = param
}

Ответ 1

Вам нужно инициализировать объекты таким образом:

class JsonParams {

    let userName = "root"
    let password = "admin01"
    var param = [String: Any]()

    init() {
        let param : [String: Any] = ["jsonrpc": "2.0", "id": 1, "method": "call", "params": [ "00000000000000000000000000000000", "session", "login", [ "username": self.userName, "password": self.password]]]
        self.param = param
    }
}

EDIT:

Если вы хотите получить userName, вы можете сделать это следующим образом:

class JsonParams {

    let userName = "root"
    let password = "admin01"
    var param = [String: Any]()

    init() {
        let param : [String: Any] = ["jsonrpc": "2.0", "id": 1, "method": "call", "params": [ "00000000000000000000000000000000", "session", "login", [ "username": self.userName, "password": self.password]]]
        self.param = param
    }

    func getUserName() -> String {

        return self.userName
    }
}

И таким образом вы можете получить доступ:

let json = JsonParams()
json.getUserName()  //"root"

Ответ 2

Общий ответ для будущих посетителей

Этот тип ошибки может возникнуть, если вы попытаетесь присвоить массив тому, что не является массивом.

Пример 1

let array: Int = [1, 3, 7, 4]
// error: contextual type Int cannot be used with array literal

В отличие от его имени константа array считается одиночной Int. Но тогда ему присваивается реальный массив. Это можно устранить одним из следующих способов.

let array = [1, 3, 7, 4]
let array: [Int] = [1, 3, 7, 4]

Пример 2

Это может быть менее очевидно при наличии вложенных массивов:

let array: [Int] = [1, 2, 7, [100, 200, 300]]
// error: contextual type Int cannot be used with array literal

Для этого вам нужно будет обобщить его на [Any].

let array: [Any] = [1, 2, 7, [100, 200, 300]]