2016-05-25 3 views
0

Я создал следующую функцию для запуска массива «iN» и «nS» 10 раз, чтобы объединить оба массива в 1. Мой план состоял в том, чтобы массировать массив до " callUpArrayResults "с этой строкой" callUpArrayResults (questionsArray) ", но я получаю сообщение« Невозможно преобразовать значение типа [AnyObject] »в ожидаемый тип аргумента« [String] ». Как и «Нельзя присваивать свойство:« Я »неизменен» для этой строки «callUpArrayResults = arr» Я собираюсь сделать это неправильно? Или я могу вызвать результат созданного массива непосредственно из функции, если так. Как мне это сделать? Я новичок в быстрой, но я пытаюсь узнать, что любое руководство будет оценено по достоинству.Попытка передать массив для работы в swift

func creatArray() { 

var iN: [AnyObject] = [ 
//a 
"Xxxxxxxx xxxxxxxxxx1", 
"Xxxxxxxx xxxxxxxxxx2", 
"Xxxxxxxx xxxxxxxxxx3", 
"Xxxxxxxx xxxxxxxxxx4", 
"Xxxxxxxx xxxxxxxxxx5", 
"Xxxxxxxx xxxxxxxxxx6", 
"Xxxxxxxx xxxxxxxxxx7", 
"Xxxxxxxx xxxxxxxxxx8", 
"Xxxxxxxx xxxxxxxxxx9", 
"Xxxxxxxx xxxxxxxxxx10", 
"Xxxxxxxx xxxxxxxxxx11", 
"Xxxxxxxx xxxxxxxxxx12", 
"Xxxxxxxx xxxxxxxxxx13", 
"Xxxxxxxx xxxxxxxxxx14", 
"Xxxxxxxx xxxxxxxxxx15", 
"Xxxxxxxx xxxxxxxxxx16"] 

var nS:[AnyObject] = [ 
"Yyyyyyyyyyyyyy yyyyyyyyy1", 
"Yyyyyyyyyyyyyy yyyyyyyyy2", 
"Yyyyyyyyyyyyyy yyyyyyyyy3", 
"Yyyyyyyyyyyyyy yyyyyyyyy4", 
"Yyyyyyyyyyyyyy yyyyyyyyy5", 
"Yyyyyyyyyyyyyy yyyyyyyyy6", 
"Yyyyyyyyyyyyyy yyyyyyyyy7", 
"Yyyyyyyyyyyyyy yyyyyyyyy8", 
"Yyyyyyyyyyyyyy yyyyyyyyy9", 
"Yyyyyyyyyyyyyy yyyyyyyyy10", 
"Yyyyyyyyyyyyyy yyyyyyyyy11", 
"Yyyyyyyyyyyyyy yyyyyyyyy12", 
"Yyyyyyyyyyyyyy yyyyyyyyy13", 
"Yyyyyyyyyyyyyy yyyyyyyyy14", 
"Yyyyyyyyyyyyyy yyyyyyyyy15", 
"Yyyyyyyyyyyyyy yyyyyyyyy16"] 

var questionsArray: [AnyObject] = [AnyObject]() 

for var i = 0; i < 10; i++ { 

    let arrayCount = iN.count 
    let random = Int(arc4random_uniform(UInt32(arrayCount))) 
    let xx = iN[random] 
    let yy = nS[random] 
     let QnA: [NSObject : AnyObject] = [ 
      "x" : xx, 
      "y" : yy 
     ] 
     //remove from array 
     iN.removeAtIndex(random) 
     Ns.removeAtIndex(random) 
     //add dictionary for each question into array 
     questionsArray.append (QnA) 

    print(questionsArray) 

} 
callUpArrayResults(questionsArray) 
} 

creatArray() 

fun callUpArrayResults(arr:[String]){ 

callUpArrayResults = arr 

} 

ответ

0

Каждый язык имеет естественный код, который нужно написать. В рамках процесса изучения языка попробуйте узнать, как код должен быть написан на этом языке.

В этом примере вы хотите объединить элементы двух массивов в массив словарей, случайно выбрать 10 из этих словарей. В Swift zip(), map() и prefix() охватывают все, кроме рандомизации. Вам нужно что-то вроде метода тасования для массива.

Вот один, что делает Fisher-Yates (быстрый и равномерный) перетасовать:

extension CollectionType { 
    func shuffle() -> [Generator.Element] { 
     var result = Array(self) 

     if result.count > 1 { 
      for i in 0 ..< result.count - 1 { 
       let j = Int(arc4random_uniform(UInt32(result.count - i))) + i 
       if i != j { 
        swap(&result[i], &result[j]) 
       } 
      } 
     } 

     return result 
    } 
} 

С shuffle() в руке, я могу решить эту проблему.

let allQuestions = zip(iN, nS).map {xx, yy in ["x": xx, "y": yy]} 
let shuffledQuestions = allQuestions.shuffle() 
let first10ShuffledQuestions = shuffledQuestions.prefix(10) 

let questionsArray: [AnyObject] = Array(first10ShuffledQuestions) 

Первая часть, zip(iN, nS).map {xx, yy in ["x": xx, "y": yy]} создает массив словарей с использованием ключа "x" для iN и "y" для nS. Следующая часть, shuffle(), возвращает массив словарей в случайном порядке. Последняя часть, возвращает срез массива перетасованного массива, содержащего первые 10 элементов. Поскольку prefix() возвращает срез массива, а не массив, используйте Array() для создания массива из среза массива для окончательного назначения questionsArray.

Все это можно сделать в одной строке.

let questionsArray: [AnyObject] = Array(zip(iN, nS).map {xx, yy in ["x": xx, "y": yy]}.shuffle().prefix(10)) 
3

Ваш код - беспорядок. Если вы собираетесь работать с массивами строк, не делайте их типами [AnyObject]. Сделайте их типами [String]. Тогда у вас не будет проблем с кастингом.

Ваши имена переменных и имена методов должны начинаться с буквы нижнего регистра. Это сильное соглашение как в Swift, так и в Objective-C. Имена классов (и имена типа Swift) должны начинаться с прописных букв.

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

Вы не делаете ни одной из этих вещей, поэтому результат вашей функции недоступен вне вашей функции.

Если вы не знаете, как это сделать, тогда пришло время начать чтение. Я предлагаю загрузить бесплатный Swift iBook от Apple и прочесть первую половину. Он научит вас быстрому языку. Если это ваш первый язык программирования, вам может понадобиться книга, в которой вам будет предложено программирование с использованием Swift в качестве языка.

+1

Благодарим за помощь. Я буду использовать ваши предложения в будущем, я действительно ценю критику. – JoeShmoe

Смежные вопросы