2016-05-24 29 views
0

In Swift (Xcode) für iOS-Entwicklung, versuche ich, meinen UILabel-Text auf die Elemente eines Arrays zu setzen. Dies ist für ein einfaches Projekt, wenn Sie eine Taste drücken: aus einem Array für 50 Elemente werden die 50 Elemente zufällig ausgewählt und dann werden 3 ausgewählt und ich möchte, dass diese auf dem UILabel angezeigt werden, aber ich bekomme den Fehler dass ich keinen Wert des Typs '[String]' dem Typ 'String' zuordnen kann? (Schnell). Hier ist mein Code HauptcodeKann den Wert vom Typ '[String]' nicht dem Typ 'String?' (Swift)

import UIKit 

class ViewController: UIViewController { 

    @IBOutlet weak var altLabel: UILabel! 
    @IBOutlet weak var asianLabel: UILabel! 
    @IBOutlet weak var bluesLabel: UILabel! 
    @IBOutlet weak var classicalLabel: UILabel! 
    @IBOutlet weak var countryLabel: UILabel! 
    @IBOutlet weak var danceLabel: UILabel! 
    @IBOutlet weak var edmLabel: UILabel! 
    @IBOutlet weak var emotionalLabel: UILabel! 
    @IBOutlet weak var euroLabel: UILabel! 
    @IBOutlet weak var indieLabel: UILabel! 
    @IBOutlet weak var inspirationalLabel: UILabel! 
    @IBOutlet weak var jazzLabel: UILabel! 
    @IBOutlet weak var latinLabel: UILabel! 
    @IBOutlet weak var newAgeLabel: UILabel! 
    @IBOutlet weak var operaLabel: UILabel! 
    @IBOutlet weak var popLabel: UILabel! 
    @IBOutlet weak var rbLabel: UILabel! 
    @IBOutlet weak var reggaeLabel: UILabel! 
    @IBOutlet weak var rockLabel: UILabel! 
    @IBOutlet weak var rapLabel: UILabel! 

    override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 

    } 

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

    @IBAction func altButton(sender: UIButton) { 

     let altSongs: [String] = ["Spirits by The Strumbellas", "Ride by Twenty One Pilots", "Ophelia by The Lumineers", "Dark Necessities by Red Hot Chili Peppers", "Bored to Death by Blink-182", "HandClap by Fitz And Tantrums", "Walking An A Dream by Empire Of The Sun", "Kiss This by The Struts", "Woman Woman by AWOLNATION", "First by Cold War Kids", "Way Down We Go by Kaleo", "Gone by Jr Jr", "Genghis Khan by Miike Snow", "Stressed Out by Twenty One Pilots", "Adventure Of A Lifetime by Coldplay", "2AM by Bear Hands", "Take It From Me by KONGOS", "Soundcheck by Catfish And The Bottlemen", "Brazil by Declan McKenna", "Destruction by Joywave", "Centuries by Fallout Boy", "Castle by Hasley", "First by Cold war Kids", "Unsteady (Erich Lee Gravity Remix) by X Ambadassadors", "Best Day Of My Life by American Authors", "Hymn For The Weekend by Coldplay", "Seven Nation Army by The White Stripes", "This is Gospel by Panic! At The Disco", "Riptide by Vance Joy", "Uma Thurman by Fallout Boy", "My Song Know What You Did In The Dark (Light Em Up) by Fall Out Boy", "Radioactive by Imagine Dragons", "Car Radio by Twenty One Pilots", "Walking On A Dream by Empire Of The Sun", "Viva La Vide by Coldplay", "Left Hand Free by Alt-J", "Tear in My Heart by Twenty One Pilots", "Death Of A Bachelor by Panic! At The Disco", "Demons by Imagine Dragons", "Emperor's New Clothes by Panic! At The Disco", "I Write Sins Not Tradegies by Panic! At The Disco", "Sail by AWOLNATION", "Twice by Catfish And The Bottlemen", "Colors by Hasley", "Nobody Really Cares If You Don't Go To The Party", "Courtney Barnett", "A Sky Full Of Stars", "On Top Of The World by Imagine Dragons", "Woman Woman by AWOLNATION", "Take Me T Church by Hozier"] 

     var shuffled = altSongs.shuffle; 
     shuffled = altSongs.choose(3) 
     altLabel.text = shuffled //(ending brackets are in place, just not shown here. **Rest of the code is just buttons structured in same format as this one**) 

Ich bin nur ein Anfänger in iOS Entwicklung

-Code für die Methoden: // (wählen) und (Shuffle)

import Foundation 
import UIKit 

extension Array { 
    var shuffle: [Element] { 
     var elements = self 
     for index in indices.dropLast() { 
      guard 
      case let swapIndex = Int(arc4random_uniform(UInt32(count - index))) + index 
       where swapIndex != index else {continue} 
      swap(&elements[index], &elements[swapIndex]) 

     } 
     return elements 
    } 
     mutating func shuffled() { 
      for index in indices.dropLast() { 
       guard 
      case let swapIndex = Int(arc4random_uniform(UInt32(count - index))) + index 
       where swapIndex != index 
        else { continue } 
       swap(&self[index], &self[swapIndex]) 
      } 
     } 
     var chooseOne: Element { 
      return self[Int(arc4random_uniform(UInt32(count)))] 
     } 
     func choose(n: Int) -> [Element] { 
      return Array(shuffle.prefix(n)) 
     } 
} 

Antwort

1
var shuffled = altSongs.shuffle; // Line 1 
shuffled = altSongs.choose(3) // Line 2 
altLabel.text = shuffled   // Line 3 

Den obigen Code durch

let shuffled = altSongs.shuffle; 
let selectedThree = shuffled.choose(3) 
altLabel.text = selectedThree[0] + " " + selectedThree[1] + " " + selectedThree[2] 
ersetzen

Hier mischen Sie das Array und legen Sie es in shuffled dann wählen Sie Array der ersten drei Elemente in selectedThree.

selectedThree ist ein Array von Strings. Wir können entweder das Array iterieren, um die Zeichenfolge zu erhalten, oder einfach die ersten drei Elemente verwenden.

+0

ich immer noch den gleichen Fehler (kippt assign Typen ‚[Zeichenfolge]‘ zu geben, wenn diese Korrektur zu tun –

+0

Fügen Sie den Code für die Umsetzung der Shuffle‘Methoden‚String?‘ 'und' wählen 'in Ihrer Frage. – BangOperator

+0

Jetzt bekomme ich den fatalen Fehler: unerwartet gefunden Null beim Entpacken ein optionaler Wert –

0

Ich weiß nicht, wo haben Sie shuffle und choose definiert und ich denke, Sie haben sie falsch implementiert.

Ich denke, man kann nur eine choose Erweiterungsmethode erstellen, die ein Array von Strings zurück:

func chooseFromArray<T>(array: [T], amountToChoose: Int) -> [T] { 
    var returnVal: [T] = [] 
    var arrayCopy = array 
    for _ in 0..<amountToChoose { 
     let chosen = Int(arc4random_uniform(UInt32(arrayCopy.count))) 
     returnVal.append(arrayCopy[chosen]) 
     arrayCopy.removeAtIndex(chosen) 
    } 
    return returnVal 
} 

Und dann kann man nur es so nennen:

var chosenSongs = chooseFromArray(altSongs, amountToChoose: 3) 

Sie sagten, Sie wollen Zeigt ein Array in einem Label an. Also ich denke du willst es so machen?

altLabel.text = chosenSongs.joinWithSeparator(", ") 

Ich denke, das sollte es beheben.

+0

ja ja, wie in anderen Kommentaren gesehen, bekomme ich immer noch diesen fatalen Fehler: unerwartet gefunden Null beim Entpacken ein optionaler Wert –

+0

@RuchirMehta Irgendwo In Ihrem Code übergeben Sie einen 'nil' Wert an eine 'var', die Sie mit '!' definiert haben. Wahrscheinlich bekommen Sie diesen Fehler. – Burak

+1

@RuchirMehta Ich denke, der Fehler wird durch einige andere Teile Ihres Codes verursacht, die Sie in dieser Frage nicht angezeigt haben. Ich schlage vor, Sie herauszufinden, wo der Fehler * genau * aufgetreten ist. Dann können Sie eine neue Frage bezüglich des Fehlers stellen. Denken Sie daran, uns zu sagen, was Sie versucht haben, es zu lösen! Danach können Sie eine der Antworten auf diese Frage akzeptieren. – Sweeper

2

Für Ihren Fehler: "unexpectedly found nil while unwrapping an Optional value", werfen Sie einen Blick auf meine Post über sie, Verständnis '!' und '?' für Swift Entwicklung von entscheidender Bedeutung ist: What are '!' and '?' marks used for in Swift

Auch, wie andere Antworten auch erwähnt, ein Array-Wert zurückgeben stattdessen sollten Sie einen String Wert geben und es dann zu Ihrem label.text Wert zuweisen. Dazu können Sie unten probieren:

altLabel.text = "\(shuffled[0]), \(shuffled[1]), \(shuffled[2])" 
+0

Ich schaute auf Ihren Post und ich verstehe, aber ich weiß nicht, wo ich irgendwelche '?' S in meinen Code setzen würde. Auch wenn ich diesen Code eingegeben habe, gab es mir eine Fehlermeldung, dass ich den Typ '()' nicht zuordnen konnte, um 'String' einzugeben. –

+0

@RuchirMehta OK, je nachdem, was Sie gesagt haben: "Dies ist die Codezeile: altLabel.text = selectedThree [0] +" "+ selectedThree [1] +" "+ selectedThree [2]" und "... couldn 't type'() 'um' String? 'einzugeben, ist das Problem, dass' shufflled 'in "altLabel.text = shufflled" verwendet wird, gibt ein' empty array 'oder' nil 'zurück. Also, es scheint etwas zu sein, das Sie in Ihren Methoden in "Array Extension" vermissen. – Burak

+0

Ich bekomme den Null-Fehler, wenn ich den Code "altLabel.text = selectedThree [0] +" "+ selectedThree [1] +" "+ selectedThree [2] "" und wenn ich den Code benutze, hast du mir "altLabel.text =" \ (shuffled [0]), \ (shuffled [1]), \ (shuffled [2]) gegeben "" der "type '()', um 'String?'" Fehler einzugeben, wenn ich Ihren Code ausgeführt habe, aber jetzt gibt es keinen Fehler. (Der Backslash ist da; er wird nur nicht im Kommentar angezeigt) –