2016-05-25 5 views
1

私は、テキストドキュメントから行を読み込んで最初の行を出力する迅速なクラスを持っています。その後、ボタンをクリックするたびに新しい行が読み込まれます。Swift:ボタンをクリックするたびにランダムな配列インデックスを表示します。

ランダムな線を最初に印刷してから、ボタンをクリックするたびにランダムな線が印刷されます。

は、ここで私がこれまで持っているものです。

import Foundation 
import UIKit 

class InfoController: UIViewController { 

// MARK: Properties 
@IBOutlet weak var difficultylevel: UILabel! 
var i:Int = 0 


override func viewDidLoad() { 
    super.viewDidLoad() 

} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

func readFile(){ 
    if let path = NSBundle.mainBundle().pathForResource("easymath", ofType: "txt"){ 
     var data = String(contentsOfFile:path, encoding: NSUTF8StringEncoding, error: nil) 

     if let content = data { 
      let myStrings = content.componentsSeparatedByCharactersInSet(NSCharacterSet.newlineCharacterSet()) 


      let randomIndex = Int(arc4random_uniform(UInt32(myStrings.count))) 
      difficultylevel.text = myStrings[randomIndex] 
     } 
    } 
} 



@IBAction func difficultybutton(sender: UIButton) { 

    difficultylevel.text = // TODO insert random index of "myStrings" array here 

} 
} 

しかし、私はボタンクリック内のTODO部にmyStringsアレイにアクセスすることはできません。これを設定する方法についてのヘルプはありますか?

+1

'myStrings'をローカル変数の代わりにプロパティにします(そして_scope_について学びます)。 – matt

+1

また、ある時点で 'readFile()'を呼び出すこともできます。おそらく 'viewDidLoad'で –

答えて

1

Swiftの変数スコープは、関数の角括弧に限定されています。だからあなたのreadFile()機能のmyStrings利用できる外を作るために、あなたはクラスのプロパティとして宣言する必要があります:

@IBOutlet var difficultyLevel: UILabel? // BTW your IBOutlet should not be weak 
var i: Int = 0 
var myStrings: [String]? 

あなたは何度もランダム機能を使用しようとしているので、私たちすることができます。このような抽象化機能

func randomString() -> String? { 
    if let strings = myStrings { 
     let randomIndex = Int(arc4random_uniform(UInt32(myStrings.count))) 
     return strings[randomIndex] 
    } 
    return nil 
} 

、あなたのインスタンス化は、この

if let content = data { 
    myStrings = content.componentsSeparatedByCharactersInSet(NSCharacterSet.newlineCharacterSet()) 
    difficultyLevel.text = randomString() 
} 

、あなたのdifficultybutton functioのようになりますnは

// Changed the name for better readibility 
@IBAction func difficultyButtonTapped(sender: UIButton) { 
    difficultyLevel.text = randomString() 
} 

最後に、あなたはそれを追加する必要がありますので、readFile関数を呼び出す任意のコードがない(抽象化されたランダムな文字列関数で)になると、おそらく@CharlesCaldwellとしてviewDidLoad機能が

指摘します
override func viewDidLoad() { 
    super.viewDidLoad() 
    readFile() 
} 
+0

うわー、それは多くの助けになります、ありがとう! – Milap

+0

うん、幸運! – ColdLogic

関連する問題