2016-05-25 1 views
0

"iN"配列と "nS"配列を10回実行して両方の配列を1つに結合する次の関数を作成しました。この行 "callUpArrayResults(questionsArray)"で "callUpArrayResults"関数を呼び出しましたが、 "タイプ '[AnyObject]'の値を期待される引数型 '[String]'に変換できません。 「このプロパティに割り当てることはできません:このセルには 'self'は不変です」callUpArrayResults = arrこの問題についてはどうですか?または、関数から直接作成された配列結果を呼び出すことはできますか?どうすればそのことを知ることができますか?私は速く新しいですが、私はどんな指針が評価されることを学ぼうとしています。すぐに機能するように配列を渡そうとしています

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

各言語には、自然なコードが書かれています。言語を学習するプロセスの一環として、その言語でコードをどのように書くべきかを学びましょう。

この例では、2つの配列の要素を辞書の配列に結合し、それらの辞書のうちの10個をランダムに選択するとします。 Swiftでは、zip()map()およびprefix()はランダム化を除くすべてをカバーします。配列のシャッフルメソッドのようなものが必要です。

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]}iNnSため"y"のキー"x"を使用して辞書の配列を作成します。次の部分shuffle()は、辞書の配列をランダムな順序で返します。最後の部分、は、最初の10要素を含むシャッフルされた配列の配列スライスを返します。 prefix()は配列ではなく配列スライスを返しますので、Array()を使用して、最後の代入の配列スライスからquestionsArrayに配列を作成します。

これはすべて1行で行うことができます。

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の型名)は、大文字で始まる必要があります。

関数内で定義されたローカル変数は、その関数が返されると終了しません。関数の外部からアクセス可能な結果を​​関数に持たせたい場合は、結果を返すか、インスタンス変数に作用させるかのどちらかにします。

あなたはこれらのことをしているわけではないので、あなたの関数の結果はあなたの関数外ではアクセスできません。

これらのいずれかを行う方法がわからない場合は、読んでみることにします。 Appleから無料のSwift iBookをダウンロードし、その前半を読むことをお勧めします。それはあなたにスウィフト言語を教えます。これがあなたの最初のプログラミング言語であれば、Swiftを言語として使ってプログラミングを教える本がほしいかもしれません。

+1

ありがとうございました。私はあなたの提案を将来使用します、私は本当に批判を感謝します。 – JoeShmoe

関連する問題