添加多个数组形成一个最终的数组。 debuggingswift xcode

我正在尝试创build一个flashcard应用程序。 我成功地获得了应用程序的地方,有11个不同的闪存卡arrays,所有这些arrays添加到一个最终arrays,然后我可以通过刷卡。 正如你所看到的,每个组在其结尾处都有“active:true”。 这是因为我有一个设置页面来打开和closures每个单词组。

import UIKit class SecondViewController: UIViewController , UIGestureRecognizerDelegate { @IBAction func home(_ sender: Any) { performSegue(withIdentifier: "home", sender: self) } @IBOutlet weak var imgPhoto: UIImageView! struct List { let words: [String] var active: Bool } let list1 = List(words:["lake", "lamb", "lamp", "lark", "leaf", "leash", "left", "leg", "lime", "lion", "lips", "list", "lock", "log", "look", "love", "lunch"], active: true) let list2 = List(words: ["ladder", "ladybug", "laughing", "lawnmower", "lemon", "leopard", "leprechaun", "letters", "licking", "lifesaver", "lifting", "lightbulb", "lightning", "listen", "llama"], active: true) let list3 = List(words: ["alligator", "balance", "ballerina", "balloon", "bowling", "cello", "colors", "curlyhair", "dollar", "dolphin", "elephant", "eyelashes", "gasoline", "goalie", "hula", "jellyfish", "olive", "pillow", "pilot", "polarbear", "rollerskate", "ruler", "silly", "telephone", "television", "tulip", "umbrella", "valentine", "violin", "xylophone", "yellow"], active: true) let list4 = List(words: ["apple", "ball", "bell", "bubble", "castle", "fall", "fishbowl", "girl", "owl", "pail", "peel", "pool", "smile", "whale", "wheel"], active: true) let list5 = List(words: ["planet", "plank", "plant", "plate", "play", "plum", "plumber", "plus"], active: true) let list6 = List(words: ["black", "blanket", "blender", "blocks", "blond", "blood", "blow", "blue"], active: true) let list7 = List(words: ["flag", "flipflop", "float", "floor", "flower", "fluffy", "flute", "fly"], active: true) let list8 = List(words: ["glacier", "glad", "glasses", "glide", "glitter", "globe", "glove", "glue"], active: true) let list9 = List(words: ["clam", "clamp", "clap", "claw", "clean", "climb", "clip", "cloud"], active: true) let list10 = List(words:["sled", "sleep", "sleeves", "slice", "slide", "slime", "slip", "slow"], active: true) let list11 = List(words: ["belt", "cold", "dolphin", "elf", "golf", "melt", "milk", "shelf"], active: true) var imageIndex: Int = 0 var imageList: [String] { let wordLists = [list1, list2, list3, list4, list5, list6, list7, list8, list9, list10, list11] let active = wordLists.reduce([]) { (result:[String], list:List) in if list.active { return result + list.words } else { return result } } return active } override func viewDidLoad() { super.viewDidLoad() imgPhoto.image = UIImage(named: imageList[imageIndex]) // Do any additional setup after loading the view. imgPhoto.isUserInteractionEnabled = true let leftSwipe = UISwipeGestureRecognizer(target: self, action: #selector(Swiped(gesture:))) leftSwipe.cancelsTouchesInView = false let rightSwipe = UISwipeGestureRecognizer(target: self, action: #selector(Swiped(gesture:))) rightSwipe.cancelsTouchesInView = false leftSwipe.direction = .left rightSwipe.direction = .right view.addGestureRecognizer(leftSwipe) view.addGestureRecognizer(rightSwipe) } func Swiped(gesture: UIGestureRecognizer) { if let swipeGesture = gesture as? UISwipeGestureRecognizer { switch swipeGesture.direction { case UISwipeGestureRecognizerDirection.right : print("User swiped right") // decrease index first imageIndex -= 1 // check if index is in range if imageIndex < 0 { imageIndex = imageList.count - 1 } imgPhoto.image = UIImage(named: imageList[imageIndex]) case UISwipeGestureRecognizerDirection.left: print("User swiped Left") // increase index first imageIndex += 1 // check if index is in range if imageIndex > imageList.count - 1 { imageIndex = 0 } imgPhoto.image = UIImage(named: imageList[imageIndex]) default: break //stops the code/codes nothing. } } } } 

但是我需要为每个闪存卡添加一个声音文件,以便每当轻敲声卡时播放一个audio文件,所以我更改了代码,以便每个组中的每个卡都与一个audio文件耦合。 但是,我还没有能够得到这个新的代码运行顺利,它是充满了bug。 我已经发布了下面的错误。 当我运行新的代码时,我应该能够像所有的图片一样滑动,就像我原来的代码一样,但是目前这是不可能的(新的代码在下面)

 import UIKit class SecondViewController: UIViewController , UIGestureRecognizerDelegate { var imageIndex: Int = 0 @IBAction func home(_ sender: Any) { performSegue(withIdentifier: "home", sender: self) } @IBOutlet weak var imgPhoto: UIImageView! struct List { let words: [Card] /*Create array of cards*/ var active: Bool } let firstList:[Card] = [ Card(image: UIImage(named: "lake")!, soundUrl: "lake"), Card(image: UIImage(named: "river")!, soundUrl: "river"), Card(image: UIImage(named: "ocean")!, soundUrl: "ocean") ] let secondList:[Card] = [ Card(image: UIImage(named: "alligator")!, soundUrl: "alligator"), Card(image: UIImage(named: "apple")!, soundUrl: "apple"), Card(image: UIImage(named: "grape")!, soundUrl: "grape") ] override func viewDidLoad() { var imageList: [String] { let list1 = List(words:firstList, active: true) let list2 = List(words:secondList, active: true) let wordLists = [list1, list2] let active = wordLists.reduce([]) { (result:[String], list:List) in if list.active { return result + list.words } else { return result } } return active } super.viewDidLoad() let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizer:))) imgPhoto.isUserInteractionEnabled = true imgPhoto.addGestureRecognizer(tapGestureRecognizer) imgPhoto.image = (wordLists)[0]; ).image // Do any additional setup after loading the view. imgPhoto.isUserInteractionEnabled = true let leftSwipe = UISwipeGestureRecognizer(target: self, action: #selector(Swiped(gesture:))) leftSwipe.cancelsTouchesInView = false let rightSwipe = UISwipeGestureRecognizer(target: self, action: #selector(Swiped(gesture:))) rightSwipe.cancelsTouchesInView = false leftSwipe.direction = .left rightSwipe.direction = .right view.addGestureRecognizer(leftSwipe) view.addGestureRecognizer(rightSwipe) } func imageTapped(tapGestureRecognizer: UITapGestureRecognizer) { itemList[imageIndex].playSound() // Your action } func Swiped(gesture: UIGestureRecognizer) { if let swipeGesture = gesture as? UISwipeGestureRecognizer { switch swipeGesture.direction { case UISwipeGestureRecognizerDirection.right : print("User swiped right") // decrease index first imageIndex -= 1 // check if index is in range if imageIndex < 0 { imageIndex = itemList.count - 1 } imgPhoto.image = itemList[imageIndex].image case UISwipeGestureRecognizerDirection.left: print("User swiped Left") // increase index first imageIndex += 1 // check if index is in range if imageIndex > itemList.count - 1 { imageIndex = 0 } imgPhoto.image = itemList[imageIndex].image default: break //stops the code/codes nothing. } } } } 

错误

我想你可能有问题,如果你使用列表模式播放单击卡的声音,更好的办法是用以下方法修改卡模型

 import Foundation; import UIKit; import AVFoundation var player: AVAudioPlayer? class Card: NSObject { var image: UIImage var soundUrl: String var isActive: Bool init(image: UIImage, soundUrl: String, isActive:Bool = true) { self.image = image self.soundUrl = soundUrl self.isActive = isActive } func playSound() { guard let url = Bundle.main.url(forResource: self.soundUrl, withExtension: "m4a") else { return } do { try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) try AVAudioSession.sharedInstance().setActive(true) player = try AVAudioPlayer(contentsOf: url) guard let player = player else { return } player.prepareToPlay() player.play() print("play") } catch let error { print(error.localizedDescription) } } } 

用法用这个代替你的viewController代码

  import UIKit class SecondViewController: UIViewController , UIGestureRecognizerDelegate { var imageIndex: Int = 0 var itemList:[Card] = [] func addlist(list:[String], flag:Bool) { for word in list { itemList.append(Card(image: UIImage(named: word)!, soundUrl: word,isActive:flag)) } } override func viewDidLoad() { super.viewDidLoad() let list1 = ["lake", "lamb", "lamp", "lark", "leaf", "leash", "left", "leg", "lime", "lion", "lips", "list", "lock", "log", "look", "love", "lunch"] let list2 = ["ladder", "ladybug", "laughing", "lawnmower", "lemon", "leopard", "leprechaun", "letters", "licking", "lifesaver", "lifting", "lightbulb", "lightning", "listen", "llama"] let list3 = ["alligator", "balance", "ballerina", "balloon", "bowling", "cello", "colors", "curlyhair", "dollar", "dolphin", "elephant", "eyelashes", "gasoline", "goalie", "hula", "jellyfish", "olive", "pillow", "pilot", "polarbear", "rollerskate", "ruler", "silly", "telephone", "television", "tulip", "umbrella", "valentine", "violin", "xylophone", "yellow"] let list4 = ["apple", "ball", "bell", "bubble", "castle", "fall", "fishbowl", "girl", "owl", "pail", "peel", "pool", "smile", "whale", "wheel"] let list5 = ["planet", "plank", "plant", "plate", "play", "plum", "plumber", "plus"] let list6 = ["black", "blanket", "blender", "blocks", "blond", "blood", "blow", "blue"] let list7 = ["flag", "flipflop", "float", "floor", "flower", "fluffy", "flute", "fly"] let list8 = ["glacier", "glad", "glasses", "glide", "glitter", "globe", "glove", "glue"] let list9 = ["clam", "clamp", "clap", "claw", "clean", "climb", "clip", "cloud"] let list10 = ["sled", "sleep", "sleeves", "slice", "slide", "slime", "slip", "slow"] let list11 = ["belt", "cold", "dolphin", "elf", "golf", "melt", "milk", "shelf"] addlist(list:list1,flag:true); addlist(list:list2,flag:true); addlist(list:list3,flag:true); addlist(list:list4,flag:true); addlist(list:list5,flag:true); addlist(list:list6,flag:true); addlist(list:list7,flag:true); addlist(list:list8,flag:true); addlist(list:list9,flag:true); addlist(list:list10,flag:true); addlist(list:list11,flag:true); let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizer:))) imgPhoto.isUserInteractionEnabled = true imgPhoto.addGestureRecognizer(tapGestureRecognizer) imgPhoto.image = itemList[0].image // Do any additional setup after loading the view. imgPhoto.isUserInteractionEnabled = true let leftSwipe = UISwipeGestureRecognizer(target: self, action: #selector(Swiped(gesture:))) leftSwipe.cancelsTouchesInView = false let rightSwipe = UISwipeGestureRecognizer(target: self, action: #selector(Swiped(gesture:))) rightSwipe.cancelsTouchesInView = false leftSwipe.direction = .left rightSwipe.direction = .right view.addGestureRecognizer(leftSwipe) view.addGestureRecognizer(rightSwipe) } @IBAction func home(_ sender: Any) { performSegue(withIdentifier: "home", sender: self) } @IBOutlet weak var imgPhoto: UIImageView! func imageTapped(tapGestureRecognizer: UITapGestureRecognizer) { itemList[imageIndex].playSound() // Your action } func Swiped(gesture: UIGestureRecognizer) { if let swipeGesture = gesture as? UISwipeGestureRecognizer { switch swipeGesture.direction { case UISwipeGestureRecognizerDirection.right : print("User swiped right") // decrease index first imageIndex -= 1 // check if index is in range if imageIndex < 0 { imageIndex = itemList.count - 1 } imgPhoto.image = itemList[imageIndex].image case UISwipeGestureRecognizerDirection.left: print("User swiped Left") // increase index first imageIndex += 1 // check if index is in range if imageIndex > itemList.count - 1 { imageIndex = 0 } imgPhoto.image = itemList[imageIndex].image default: break //stops the code/codes nothing. } } } } 

我可以在代码中find以下错误。

  1. imageList在viewDidLoad中声明,并在imageTappedimageTapped方法中访问。 这个方法看不到imageList 。 您可以使imageList类variables或将其作为parameter passing给imageTapped方法。
  2. 另外super.viewDidLoad必须在你的情况下任何代码之前调用, var imageList: [Any]在调用super.viewDidLoad之前被初始化
  3. return active as! [String] return active as! [String]总是失败,因为您无法将[Any]转换为String 。 图像列表必须是Card列表,即[Card]
  4. 记住3,我重写了imageList代码如下。 希望这可以帮助
 let list1 = List(words:firstList, active: true) let list2 = List(words:secondList, active: true) let wordLists = [list1, list2] var imageList: [Card] = [] for list in wordLists { if list.active{ imageList.append(contentsOf: list.words) } }