Массив кортежей в Свифте

У меня есть функция:

func parseJSON3(inputData: NSData) -> NSArray { var tempDict: (id:Int, ccomments:Int, post_date:String, post_title:String, url:String) = (id: 0, ccomments: 0, post_date: "null", post_title: "null", url: "null") var resultArray: (id:Int, ccomments:Int, post_date:String, post_title:String, url:String)[] = [] var error: NSError? var jsonDictionary: NSDictionary = NSJSONSerialization.JSONObjectWithData(inputData, options: NSJSONReadingOptions.MutableContainers, error: &error) as NSDictionary var firstArray = jsonDictionary.objectForKey("locations") as NSArray for dict in firstArray { tempDict.id = dict.valueForKey("ID") as Int tempDict.ccomments = dict.valueForKey("ccomments") as Int tempDict.post_date = dict.valueForKey("post_date") as String tempDict.post_title = dict.valueForKey("post_title") as String tempDict.url = dict.valueForKey("url") as String resultArray.append(tempDict) } return resultArray } 

В очереди

resultArray.append (tempDict)

У меня есть ошибка:

Отсутствует аргумент для параметра ‘ccomments’ в вызове

Зачем? Помоги пожалуйста….

Мне кажется, что resultArray.append() обрабатывает кортеж немного как переменный параметр и пытается расширить кортеж, чтобы он соответствовал его собственным аргументам. Он жалуется на ваш второй параметр, потому что он только ожидает его. Я не видел этого поведения для Array.append() где-то в документах, поэтому я бы сказал, что это ошибка в Swift.

Использование оператора добавления += , похоже, не имеет такой проблемы:

 resultArray += tempDict 

Так что это довольно дико – не уверен, что я буду квалифицировать его как ошибку или как недокументированное поведение, но это определенно то, что должно быть на радаре для исправления / разъяснения!

Ситуация заключается в том, что append обрабатывает ваш аргумент tempDict (который мы ожидаем быть единственным аргументом метода Array, который принимает один член и добавляет его в коллекцию) в качестве первого аргумента в сигнатуре, где он ищет 5 аргументов (!), по одному для каждого члена типа Tuple, который имеет массив.

Для некоторых интересных действий см. Следующие сведения (включая присвоение метки одному члену 1-членного «Tuple» ??) ->

 var arrayOne: Array = [] arrayOne.append("hi") println(arrayOne[0]) // hi var arrayTwo: Array<(String)> = [] // where (String) is a single-member Tuple arrayTwo.append("hi") println(arrayTwo[0]) // hi println(arrayTwo[0].0) // hi -> using .0 subscript to access the first member of the Tuple // wanna see something crazy? remember arrayOne, that holds members of type String? println(arrayOne[0].0) // hi -> this Array does not hold Tuples, but it looks like we can still treat its members like "single-member Tuples"? var arrayThree: Array<(str: String)> = [] // members of the Array are single-member Tuples with the label 'str' for their member arrayThree.append(str: "hi") // now we can't use append without providing the label 'str', acting as what looks like an argument label? var byeString = "bye" var byeTuple = ("bye") arrayThree += byeString // += doesn't care about the label, and will take either a String or a single-member Tuple holding a String arrayThree += byeTuple println(arrayThree[0]) // hi println(arrayThree[0].0) // hi println(arrayThree[0].str) // hi -> accessing the single member of the Tuple by its label 

… так что в вашем случае, когда вы видите ошибку с append того, что она хочет вам сделать (используя метки, которые вы использовали для объявления Tuple, как что-то похожее на метки аргументов):

 var resultArray: (id:Int, ccomments:Int, post_date:String, post_title:String, url:String)[] = [] ... resultArray.append(id: someIntValue, ccomments: someOtherIntValue, post_date: someStringValue, post_title: someOtherStringValue, url: someAnotherStringValue) 

… и, конечно, как обсуждалось, вы можете избежать этого, просто используя += вместо

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

resultArray.append() похоже, принимает tempDict как первый элемент кортежа ( id ).

Изменение его на:

resultArray += tempDict

похоже, компилируется и работает.

Я не уверен, почему append() не ведет себя одинаково, возможно, вы можете подать ошибку!

  • Как отправить запрос POST с BODY в быстром
  • Перенаправить NSLog в файл в Swift не работает
  • Безопасный (проверенный граница) поиск массива в Swift через дополнительные привязки?
  • Xcode 8 / Swift 3: простой код UIPicker не работает
  • Как использовать stringByAddingPercentEncodingWithAllowedCharacters () для URL-адреса в Swift 2.0
  • Как работает строковая подстрока в Swift
  • Как сделать случайное число между диапазоном для arc4random_uniform ()?
  • NSDateFormatter возвращает неверную дату + Swift
  • NSFontAttributedString работал до XCode 6.1
  • Передача аргументов в селектор в Swift
  • Вырезать UIImage в круг
  • Interesting Posts

    Сохранить «Проверить элемент»

    RAID 1 без защиты кеша – ZMCP / резервная батарея

    Как повторно использовать области, controllerы, представления, модели, маршруты в нескольких приложениях или веб-сайтах

    У LESS есть функция «расширения»?

    Буквенное письмо с данным файлом в пакете окон

    Могу ли я преобразовать значение строки C # в экранированный строковый литерал

    JAXB- @XmlMixed использование для чтения @XmlValue и @XmlElement

    Запретить повышение (UAC) для приложения, которое не нуждается в нем

    Почему нет назначения-назначения / move-constructor по умолчанию?

    Какую страtagsю вы используете для именования пакетов в проектах Java и почему?

    Как скрыть элемент при прокрутке страницы?

    Применение пользовательских фильтров к выходу камеры

    Ошибка 619 при попытке подключения к клиенту Windows VPN

    Автоматически создавать весь путь при записи в новый файл

    Как сериализовать / десериализовать простые classы в XML и обратно

    Давайте будем гением компьютера.