【问题标题】:Structure passing variables in another class结构在另一个类中传递变量
【发布时间】:2017-12-24 17:45:39
【问题描述】:

基本上,我正在尝试构建一个音乐播放器应用程序来学习 iOS 平台和 Swift 3,但我目前停留在一个简单的步骤上。我正在尝试创建一个歌曲类型的数组,并将歌曲名称、歌曲艺术家等附加到该数组中。

该功能也需要修改。我之前使用它与一组名称,但之后我决定创建这个结构。

import Foundation

struct Song {


    var _songTitle:String?

    var _songArtist:String?

    var _songDuration:Double?

    var _songCover:String?

}


import AVFoundation

类 AudioManager: NSObject, AVAudioPlayerDelegate {

static let sharedInstance = AudioManager()

var currentSong = 0

var currentTime = 0

var player: AVAudioPlayer = AVAudioPlayer()

private override init() {}


private var songs: [Song] = []

func play()
{

        player.play()
}

func stop() {
    if player.isPlaying{
     player.stop()
    }

}

func playThis()
{

    do
    {
        guard let audioPath = Bundle.main.path(forResource: songs._songTitle?[currentSong], ofType: ".mp3")
            else {
                return

        }
        try player = AVAudioPlayer(contentsOf: NSURL(fileURLWithPath: audioPath) as URL)

    }
    catch
    {
        print ("ERROR")

    }


}


    func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool)
{

    if flag {
        currentSong += 1
    }

    if ((currentSong + 1) == songs.count) {
        currentSong = 0
    }


}

func skipForward() {
    var timeToSkip: TimeInterval = player.currentTime
    timeToSkip += 5.0
    player.currentTime = timeToSkip
}

func skipBack() {
    var timeToSkip: TimeInterval = player.currentTime
    timeToSkip -= 5.0
    player.currentTime = timeToSkip
}

func gettingSongNames()
{
    let folderURL = URL(fileURLWithPath:Bundle.main.resourcePath!)

    do
    {
        let songPath = try FileManager.default.contentsOfDirectory(at: folderURL, includingPropertiesForKeys: nil, options: .skipsHiddenFiles)

        //loop through the found urls
        for song in songPath
        {
            var mySong = song.absoluteString

            if mySong.contains(".mp3")
            {
                let findString = mySong.components(separatedBy: "/")
                mySong = findString[findString.count-1]
                mySong = mySong.replacingOccurrences(of: "%20", with: " ")
                mySong = mySong.replacingOccurrences(of: ".mp3", with: "")
                song._songTitle.append(mySong)

            }

        }


    }
    catch
    {
        print ("ERROR")
    }
}

}

【问题讨论】:

  • 请包含所有有问题的相关代码并且不要链接它,特别是不要作为屏幕截图。另外,你的问题是什么?
  • 按照教程进行操作,否则对您来说会很困难。
  • 我害怕你的问题。
  • 因此,如果这是一个类,我可以通过 class.variable 访问变量名并将字符串附加到那里,但是使用 struct 则无法正常工作。如何更新方法,以便我可以在每个字符串(歌曲名称)中附加歌曲数组?

标签: ios struct swift3


【解决方案1】:

您以错误的顺序组合了结构成员访问和数组索引。例如,您有一个 [Song] 类型的数组 song,这是一个歌曲数组,并且要访问您编写的特定标题:

songs._songTitle?[currentSong]

上面写着“songs 有一个数组值属性_songTitle,访问它的currentSong 元素”——这是倒退的。你需要先访问数组元素,它返回一个Song,然后是属性:

songs[currentSong]._songTitle

您似乎还希望创建一首仅指定标题的新歌曲。为此,您应该按照以下方式向Song 添加一个init 方法:

init(withTitle: String) { ... }

它将新歌曲的标题设置为提供的值,并将其他属性设置为nil。 (如果您不了解 init 方法,请查看 Apple 的 Swift 书籍。)

一旦你有了这个初始化器,添加一首新歌就会变成这样:

songs.append( Song(withTitle:mySong) )

HTH

【讨论】:

    【解决方案2】:

    您可以在 AudioManager 类实例中添加一个方法来执行添加歌曲,如下所示:

    func addSong(song: Song) {
        songs.append(song)
    }
    

    你可以这样使用它:

    let song = Song(_songTitle: "Title", _songArtist: "Artist", _songDuration: 0, _songCover: "Cover")
    AudioManager.sharedInstance.addSong(song: song)
    

    你不能这样做 song._songTitle.append(mySong) 因为 _songTitle 是一个字符串,而不是一个数组。如果要进行追加,则必须将其声明为数组。

    【讨论】:

    • 所以,如果我理解正确,我必须在我附加歌曲的 audioManager 类中创建一个不同的数组 songName。但是我如何将歌曲名称添加到 Song Struct Array 而无需手动声明 Song 类型的新实例。
    猜你喜欢
    • 2012-02-04
    • 2011-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 2016-10-03
    • 2013-02-08
    相关资源
    最近更新 更多