2016-11-11 7 views
0

私は毎晩真夜中から配列の新しい要素を選択しようとしています。そして、すべての要素が使用されると、配列の先頭にジャンプします。そうする最良の方法は何でしょうか?ここに私がこれまで持っているものがあります。剰余演算子を使用し、配列を包み込むように毎日新しい配列要素を印刷できますか?

import UIKit 

var wordsArray = [String]() 

wordsArray = ["Hallo","Apfel","Geburtstag","Pherd","Angst"] 

let date = NSDate() 
let calendar:NSCalendar! = NSCalendar(calendarIdentifier: NSCalendar.Identifier.gregorian) 
var dateComponents = DateComponents() 
dateComponents.day = 1 

while wordsArray (0..<2) { 
    gregorian.date(byAdding: NSCalendar.Unit.day, value: $0, to: now, options: NSCalendar.Options(rawValue: 0)) 
} 
+1

"最初からアレイにジャンプする"、または真夜中に何かを表示する方法は問題ですか? –

答えて

0

を満たす私はあなたが右理解していれば、あなたが毎日特定の配列要素を使用すると、これらの要素が循環的に選択する必要があります。
主な問題は、真夜中に毎日何かをする方法です。これはTimerを使用して達成することができる

// First determine coming midnight 
let calendar = NSCalendar.current 
let nextDay = calendar.date(byAdding: .day, value: 1, to: Date()) 
let comingMidnight = calendar.startOfDay(for: nextDay!) 

// Then start a time coming midnight, and repeat it every day 
// Please note that 24 * 60 * 60 is not completely correct considering daylight saving times 
// Sometimes days have 23 hours and sometimes 25 hours! 
_ = Timer.init(fireAt: comingMidnight, interval: 24 * 60 * 60, target: self, selector: Selector(("timerFired")), userInfo: nil, repeats: true) 

// And this is the timer callback: 
func timerFired(timer: Timer) { 
    // Here you can select the next element in your array, any do what is required 
    // For selecting the elements cyclically, see the other answers! 
} 

このコードは、テストされていないが、それはあなたの進め方アイデアを与える必要があります。

+0

ありがとう!これは本当に役に立ちました。 –

0

、それはindex/number of items in the arrayをデバイドし、除算の余りを返します - この場合には、常に0...4

let wordsArray = ["Hallo","Apfel","Geburtstag","Pferd","Angst"] 

for i in 0..<10 { 
    print(wordsArray[i % wordsArray.count]) 
} 

あなたのコード

にインデックス変数を作成します。
var index = 0 

このように増分します。

index = (index + 1) % wordsArray.count 
-1

これは私が考えることができる最も簡単な方法です。

var wordsArray = [String]() 
    wordsArray = ["Hallo","Apfel","Geburtstag","Pherd","Angst"] 
    let secondsInDay = (60 * 60 * 24) 
    let dayNumber = Int(NSDate().timeIntervalSince1970/Double(secondsInDay)) 
    let selectedNumber = dayNumber % wordsArray.count 
    let chosenWord = wordsArray[selectedNumber] 
    print(chosenWord) 

EDIT:別の方法がうまくいけば、苦情

var wordsArray = [String]() 
    wordsArray = ["Hallo","Apfel","Geburtstag","Pherd","Angst"] 

    let calendar = Calendar(identifier: .gregorian) 
    let date = Date() 
    let yearNumber = calendar.component(.year, from: date) 
    let monthNumber = calendar.component(.month, from: date) 
    let dayNumber = calendar.component(.day, from: date) 

    let daysInYear = Double(yearNumber) * 12.0 * 365.25 
    let daysInMonth = Double(monthNumber) * 30.42 
    let totalNumber = daysInYear + daysInMonth + Double(dayNumber) 

    let selectedNumber = Int(totalNumber) % wordsArray.count 
    let chosenWord = wordsArray[selectedNumber] 

    print(chosenWord) 
+2

** '60 * 60 * 24'を日中の期間として使用しないでください。正確である必要はありません。サマータイムのある地域では、1日は23時間、24時間、または25時間かかる可能性があります。常に適切なカレンダー方法を使用してください。 –

+0

しかし、それはすべて同じことを平均しています。これは技術的に小さな調整をすることで機能します... – Sethmr

+0

@MartinRカレンダーコンポーネントを使用して別の方法を追加しましたが、それでも平均を使用します。このように設計することの全ポイントは、アプリケーションが何日実行しても、次の日の配列の次の行であることを確実にすることです。月または年のいずれかの日だけを考慮する場所で一緒に投げると、対応する月/年の初めにループがリセットされます。 – Sethmr

関連する問題