объединяя несколько массивов. отладка xcode swift

57
4

Я нахожусь в процессе создания флеш-карты. Я прикрепил свой код ниже. Когда приведенный ниже код запускается, пользователь должен иметь возможность прокручивать влево и вправо по массиву карт (каждая карта содержит изображение в сочетании со звуком. Существует два массива карт, называемых firstList и secondList). Когда изображение используется, звук, с которым он соединен, должен воспроизводиться. У меня нет проблемы с воспроизведением звука или прокруткой по одному списку. Тем не менее, я получаю сообщение об ошибке при попытке комбинировать и прокручивать "firstList" и "secondList". Одна из ошибок, которые я не могу понять, заключается в том, что "тип выражения неоднозначен без дополнительного контекста". см. код и приведенную ниже ошибку

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

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

спросил(а) 2020-04-03T23:33:51+03:00 5 месяцев, 4 недели назад
1
Решение
79

Первая проблема:

result + list.words

result является [String] а list.words - [Card]. Что вы пытаетесь выполнить с этой линией?

Вторая проблема:

imgPhoto.image = (wordLists)[0];).image

wordLists - это [List], каждый из которых содержит [Card] как words свойства

Похоже, вы пытаетесь захватить изображение с одной из карт в одном из списков, но неясно, какую карту вы пытаетесь захватить. Примером захвата изображения с первой карты из первого списка будет:

imgPhoto.image = wordLists[0].words[0].image

Третья проблема:

Вы пытаетесь обратиться к переменной под названием itemList, которая, похоже, не существует. Он не указан нигде в коде, который вы указали, но я подозреваю, что он предназначен для свойства этого класса.

ответил(а) 2020-04-03T23:48:32.208684+03:00 5 месяцев, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема