Можете ли вы использовать подстановочные знаки при объявлении переменных в swift? - PullRequest
0 голосов
/ 09 июня 2018

Я изучаю кодирование, создавая приложение для Soundboard.Я использую audioEngine для воспроизведения некоторых звуков после того, как я немного изменил мелодии.В моем viewDidLoad я объявляю мой variables:

var audioFile1 = AVAudioFile()
var audioFile2 = AVAudioFile()

if let filePath = Bundle.main.path(forResource: "PeteNope", ofType:
        "mp3") {
        let filePathURL = URL(fileURLWithPath: filePath)

        setPlayerFile(filePathURL)

    }
if let filePath2 = Bundle.main.path(forResource: "Law_WOW", ofType:
        "mp3") {
        let filePath2URL = URL(fileURLWithPath: filePath2)

        setPlayerFile2(filePath2URL)

    }
func setPlayerFile(_ fileURL: URL) {
    do {
        let file1 = try AVAudioFile(forReading: fileURL)

        self.audioFile1 = file1


    } catch {
        fatalError("Could not create AVAudioFile instance. error: \(error).")
    }
}

func setPlayerFile2(_ fileURL: URL) {
    do {
        let file2 = try AVAudioFile(forReading: fileURL)

        self.audioFile2 = file2


    } catch {
        fatalError("Could not create AVAudioFile instance. error: \(error).")
    }
}

, затем я подключаю nodes следующим образом:

audioEngine.attach(pitchPlayer)
audioEngine.attach(timePitch)
audioEngine.connect(pitchPlayer, to: timePitch, format: audioFile1.processingFormat)
audioEngine.connect(timePitch, to: audioEngine.outputNode, format: audioFile1.processingFormat)
audioEngine.connect(pitchPlayer, to: timePitch, format: audioFile2.processingFormat)
audioEngine.connect(timePitch, to: audioEngine.outputNode, format: audioFile2.processingFormat) 

Итак, мой вопрос, поскольку переменныеидентичны, за исключением числа, есть ли способ написать это программно, чтобы мне не приходилось объявлять nodes по отдельности.

1 Ответ

0 голосов
/ 09 июня 2018

Насколько я понимаю ваш вопрос, у вас много ресурсов типа "PeterNope" и "Law_WOW" и вы хотите быстро добавить их в виде узлов.

Ваш код может быть реорганизован следующим образом, чтобы добавить столько ресурсов, сколько вы хотите:

var resources = ["PeterNope", "Law_WOW", "otherResource1", "otherResource2", ...]

func setPlayerFile(_ fileName: String) {
    // make sure resource exists and break if not.
    guard let filePath = Bundle.main.path(forResource: fileName, ofType: "mp3") else {
        print ("resource file \(fileName) does not exist")            
        return
    }

    let fileURL = URL(fileURLWithPath: filePath)

    // open file from resource
    do {
        let file = try AVAudioFile(forReading: fileURL)
    } catch {
        fatalError("Could not create AVAudioFile instance. error: \(error).")
    }

    // connect nodes
    connect(pitchPlayer, to: timePitch, format: file.processingFormat)
    audioEngine.connect(timePitch, to: audioEngine.outputNode, format: file.processingFormat)
}

// connect all resources
attach(pitchPlayer)
audioEngine.attach(timePitch)

for index in 0..(resources.count - 1) {
    setPlayer(resources[index]
}

// or quicker and swiftier:
resources.forEach { setPlayerFile($0) }

Я рекомендую прочитать о циклах и потоке управления в целом: https://docs.swift.org/swift-book/LanguageGuide/ControlFlow.html

...