2016-05-24 171 views
0

在Swift(Xcode)for ios开发中,我试图将我的UILabel的文本设置为数组的元素。这是一个简单的项目,当你按下一个按钮时:50个元素之外的50个元素将被随机化,然后选择3个,我希望这3个元素被显示在UILabel上,但是我得到错误我无法指定'[String]'类型的值来键入'String?' (迅速)。这里是我的代码主要的代码无法指定'[String]'类型的值来键入'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**) 

我只在iOS的初学者开发

代码的方法://(选择)和(洗牌)

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)) 
     } 
} 

回答

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

将上面的代码替换为

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

在这里,您将数组进行洗牌并将其放入shuffled,然后选取selectedThree中前三个元素的数组。

selectedThree是一个字符串数组。我们可以迭代数组来获取字符串,或者只使用前三个元素。

+0

我仍然得到同样的错误(不能分配型“[字符串]”键入这样做修正 –

+0

时添加的代码执行的方法“洗牌“的字符串? '和'选择'在你的问题 – BangOperator

+0

现在我得到致命的错误:意外地发现零,同时解开一个可选值 –

0

我不知道你在哪里定义了shufflechoose,我认为你错误地实现了它们。

我想你可以创建一个返回字符串数组的choose扩展方法:

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 
} 

然后你可以这样调用:

var chosenSongs = chooseFromArray(altSongs, amountToChoose: 3) 

你说你要在标签中显示数组。所以我想你想这样做?

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

我认为应该解决它。

+0

所以是的,如其他评论中所见,我仍然得到这个致命错误:意外地发现零,同时展开一个可选值 –

+0

@RuchirMehta Somewhere在你的代码中,你将一个'nil'值传递给'var',你已经用'!'定义了'var',这可能就是为什么你会得到这个错误。 – Burak

+1

@RuchirMehta我认为这个错误是由你的代码的其他部分引起的,你没有在这个问题中显示。我建议你找出错误发生的位置。然后,您可以提出有关错误的新问题。请记住告诉我们您试图解决的问题!之后,你可以接受这个问题的答案之一。 – Sweeper

2

对于你的错误:“unexpectedly found nil while unwrapping an Optional value”,看看我的帖子关于他们,理解'!'和'?'对于飞速发展的关键: What are '!' and '?' marks used for in Swift

此外,作为其他的答案也提到,你是返回数组值,而不是你应该给一个String值,然后将其分配给您的label.text值。对于这一点,你可以试试下面:

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

我看了你的帖子,我明白了,但我不知道我会在哪里放置任何'?'的代码。另外,当我输入代码时,它给了我一个错误,说我不能分配类型'()'来键入'String?' –

+0

@RuchirMehta OK,根据你所说的:“这是代码行:altLabel.text = selectedThree [0] +”“+ selectedThree [1] +”“+ selectedThree [2]”and“... couldn分配类型'()'来键入'字符串?'“,问题是'altLabel.text = shuffled'中使用'混洗',返回'空数组'或'nil'。所以,看起来有一些你在你的方法中错过了“Array Extension” – Burak

+0

当我使用代码“altLabel.text = selectedThree [0] +”“+ selectedThree [1] +”“+ selectedThree [2]“”,当我使用你给我的代码“altLabel.text =”\(shuffled [0]),\(shuffled [1]),\(shuffled [2])“”。当我运行你的代码时,“type'()'键入'String?'”错误,但现在没有错误(反斜杠在那里,它只是没有显示在注释中) –

相关问题