2017-02-01 5 views
0

シナリオスウィフト3:どのようにループ配列に対してループするために使用する

のは、私はこの配列で印刷データに私を可能にbutton機能を持っているarray = ["a", "b", "c", "d"]

をしたとしましょう。私はforループを使って配列をループします。

最後の配列要素(index[3])が4回目のクリックで印刷された後、5回目のクリックで開始点(index[0])から印刷します。

ご協力いただきありがとうございます。

は、ボタンがタップされたときに

+0

無関係な質問タイトル –

答えて

3

このため、配列オブジェクトの現在の要素のインデックスを維持するだけで済みます。

var currentIndex = 0 

@IBAction func buttonClick(_ sender: UIButton) { 
    print(array[currentIndex]) 
    currentIndex += 1 
    if currentIndex == array.count { 
     currentIndex = 0 
    } 
} 
+0

これはコメントでなければなりません。 –

+1

@ VishalSonawane編集された答え。 –

+0

はい..アップしました:) –

3

次のクリック数のVAR(0で初期化)を保持し、使用ありがとう:

let valToPrint = yourArray[clickCount % yourArray.count] 
clickCount += 1 

print("Current value = \(valToPrint)") 

%(モジュロ)オペレータ必要とされる範囲を循環clickCount

+1

この場合、あなたは単に配列がnilの場合のデフォルト値を返し、シーケンスは無限(決して-終端)であるとすることができvar clickCountを0に初期化すると、値はまったく変更されません。どのように私はそれを初期化する必要がありますか? – Meebfel

+0

あなたは正しいです! 0を使用すると動作しません。編集された答え – giorashc

+0

@Meebfel 'clickCount'が' var'として宣言されている場合、もちろんそれを変更することができます。関数内で宣言している可能性があります。その場合は、関数の外に移動します。 – Adeel

0

ボタンのコードの下のライト

@IBAction func myButton(_ sender: UIButton) { 

    if sender.tag > array.count{ 
     sender.tag = 0 
    } 

    print("array[\(sender.tag)] = \(array[sender.tag])") 
    sender.tag += 1 

} 
1

をクリックあなたはそれの技術的な喜びのために

let letters = ["a", "b", "c", "d"] 
var index = 0 

func printNext() { 
    print(letters[index]) 
    index = (index + 1) % letters.count 
} 

enter image description here

+1

ああもちろん、私はそれをあまりにも速くスキミングしました、あなたはインデックスを直接使用すると信じて! – dfri

0

を書くことができます:別の代替は、シーケンスを定義することです配列の要素を循環します。あなたは、配列が可変であるとする(var)と、それは今までに空になった場合には

class Foo { 
    private let array: [String] 

    private lazy var cyclingSequenceOverArray: 
     UnfoldSequence<String, Int> = sequence(state: -1) { 
     (state: inout Int) -> String? in 
     guard !self.array.isEmpty else { return nil } 
     return self.array[(state = (state + 1) % self.array.count, state).1] 
    } 

    init(_ array: [String]) { 
     self.array = array 
    } 

    func printNext() { 
     if let next = cyclingSequenceOverArray.next() { 
      print(next) 
     } 
    } 
} 

let foo = Foo(["a", "b", "c", "d"]) 

foo.printNext() // a 
foo.printNext() // b 
foo.printNext() // c 
foo.printNext() // d 
foo.printNext() // a 
foo.printNext() // b 

:(上記の実装として)next()メソッドの呼び出しの不変の配列を考えると

シーケンスはシーケンスを終了します。すなわち、配列が再充填されたとしても、その後のnext()への呼び出しでは、まだnilが返されます。

class Foo { 
    var array: [String] 

    private lazy var cyclingSequenceOverArray: 
     UnfoldSequence<String, Int> = sequence(state: -1) { 
     (state: inout Int) -> String in 
     guard !self.array.isEmpty else { return (state = -1, "Empty!").1 } 
     return self.array[(state = (state + 1) % self.array.count, state).1] 
    } 

    init(_ array: [String]) { 
     self.array = array 
    } 

    func printNext() { 
     if let next = cyclingSequenceOverArray.next() { 
      print(next) 
     } 
    } 
} 

使用例:

let foo = Foo(["a", "b", "c", "d"]) 

foo.printNext() // a 
foo.printNext() // b 
foo.printNext() // c 

foo.array = [] 

foo.printNext() // Empty! 
foo.printNext() // Empty! 

foo.array = ["a", "b", "c", "d"] 

foo.printNext() // a 
foo.printNext() // b 
foo.array[2] = "C" 
foo.printNext() // C 

foo.array = ["1", "2", "3"] 

foo.printNext() // 1 
関連する問題