2017-08-03 2 views
0

Ich bin dabei, eine Flashcard-App zu erstellen. Ich habe meinen Code unten angehängt. Wenn der unten stehende Code ausgeführt wird, sollte der Benutzer in der Lage sein, nach links und rechts durch ein Array von Karten zu streichen (jede Karte enthält ein Bild, das mit einem Sound gekoppelt ist. Es gibt zwei Kartenfelder namens firstList und secondList). Wenn ein Bild angetippt wird, sollte der Sound, mit dem es gekoppelt ist, abgespielt werden. Ich bekomme kein Problem beim Abspielen des Klangs oder beim Durchwischen einer einzelnen Liste. Allerdings bekomme ich einen Fehler, wenn ich versuche, "firstList" und "secondList" zu kombinieren und durchzuwischen. Einer der Fehler, die ich nicht herausfinden kann, ist "Art des Ausdrucks ist mehrdeutig ohne mehr Kontext". sehen Sie bitte den Code und die Fehler unterArt des Ausdrucks ist mehrdeutig ohne mehr Kontext. xcode swift

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(image: UIImage(named: "lake")!, soundUrl: "Lake"), 
    Card(image: UIImage(named: "lamb")!, soundUrl: "Lamb"), 
    Card(image: UIImage(named: "lamp")!, soundUrl: "Lamp"), 
    Card(image: UIImage(named: "lark")!, soundUrl: "Lark"), 
    Card(image: UIImage(named: "leaf")!, soundUrl: "Leaf"), 
    Card(image: UIImage(named: "leash")!, soundUrl: "Leash"), 
    Card(image: UIImage(named: "left")!, soundUrl: "Left"), 
    Card(image: UIImage(named: "leg")!, soundUrl: "Leg"), 
    Card(image: UIImage(named: "lime")!, soundUrl: "Lime"), 
    Card(image: UIImage(named: "lion")!, soundUrl: "Lion"), 
    Card(image: UIImage(named: "lips")!, soundUrl: "Lips"), 
    Card(image: UIImage(named: "list")!, soundUrl: "List"), 
    Card(image: UIImage(named: "lock")!, soundUrl: "Lock"), 
    Card(image: UIImage(named: "log")!, soundUrl: "Log"), 
    Card(image: UIImage(named: "look")!, soundUrl: "Look"), 
    Card(image: UIImage(named: "love")!, soundUrl: "Love"), 
    Card(image: UIImage(named: "lunch")!, soundUrl: "Lunch") 
     ] 

let secondList = [ 
    Card(image: UIImage(named: "lake")!, soundUrl: "Lake"), 
    Card(image: UIImage(named: "lamb")!, soundUrl: "Lamb"), 
    Card(image: UIImage(named: "lamp")!, soundUrl: "Lamp"), 
    Card(image: UIImage(named: "lark")!, soundUrl: "Lark"), 
    Card(image: UIImage(named: "leaf")!, soundUrl: "Leaf"), 

    ] 




    override func viewDidLoad() { 
    super.viewDidLoad() 

     let list1 = List(words:firstList, active: true) 
     let list2 = List(words:secondList, active: true) 

     var imageList: [String]{ 
      let wordLists = [list1, list2] 

      print((wordLists[0]).words[0].soundurl) 


      let active = wordLists.reduce([]) { (result:[String], list:List) in 
       if list.active { 
        return result + list.words 

       } else { 
        return result 
       } 
      } 

      return active 

     } 


    let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizer:))) 
    imgPhoto.isUserInteractionEnabled = true 
    imgPhoto.addGestureRecognizer(tapGestureRecognizer) 

    imgPhoto.image = (imageList[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 imageTapped(tapGestureRecognizer: UITapGestureRecognizer) 
{ 
    print("hhh") 
    imageList[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 = words.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. 
     } 
    } 
} 
} 

enter image description here

import Foundation; import UIKit; import AVFoundation 

var player: AVAudioPlayer? 

class Card: NSObject 
{ 
var image: UIImage 
var soundUrl: String 


init(image: UIImage, soundUrl: String) { 
    self.image = image 
    self.soundUrl = soundUrl 
} 
func playSound() 

{ print("play") 
    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("hhh") 
    } catch let error { 
     print(error.localizedDescription) 
    } 
} 
} 

Antwort

0

result ist vom Typ [String], aber list.words ist vom Typ [Card]. Swift weiß nicht, wie Sie diese beiden in der Anweisung return result + list.words kombinieren möchten.

Swift erfordert, dass Sie sich über Typen sehr genau auskennen. Also, Sie müssen genau angeben, was Sie wollen, wenn es eine Frage gibt.

Sie zeigen Ihre nicht Card Art, also werde ich Ihnen ein allgemeines Beispiel geben:

var list1:[String] = ["a", "b", "c"] 
var list2:[Any] = ["d", "e", "f"] 

let newList = list1 + list2 
// error: type of expression is ambiguous without more context 

Diese Kombination möglich sein sollte, da beide Listen String Werte enthalten. Da list2 jedoch angibt, dass es vom Typ [Any] ist, ist Swift nicht sicher, ob die Verkettung beabsichtigt ist. Es wird Ihnen den "mehrdeutigen" Fehler geben.

Um dies zu beheben, müssen Sie in Bezug auf die Arten in Frage spezifisch sein - das heißt, Sie müssen für die Typen werfen Sie Swift verwenden möchten:

let newList = list1 + (list2 as! [String]) 

Da list1 bereits von [String] Typ, Swift Jetzt wissen Sie, dass Sie einen resultierenden [String] Typ möchten. (In diesem Fall wird Swift implizit [String] als Typ für newList zuweisen.)

Beachten Sie auch, dass Ihre Typen kompatibel sein müssen, um dies zu tun! Wenn [Card] nicht etwas ist, das in [String] konvertiert wird, erhalten Sie einen weiteren Fehler.

+0

ive hat meine Kartenklasse hinzugefügt, wenn Sie einen Blick darauf werfen könnten. –

+0

Ihre 'Card' Klasse ist definitiv nicht kompatibel mit' String', @AnthonyRubin. Sie können sich an einen Lehrer oder Mentor wenden, um Unterstützung zu erhalten. Wenn keine verfügbar sind, können Sie Zeit mit einem Mentor auf einer Website wie [Codementor] (https://www.codementor.io) kaufen – leanne

Verwandte Themen