Arrays Swift/tvOS:具有多个字符串的复杂数组?

Arrays Swift/tvOS:具有多个字符串的复杂数组?,arrays,swift,avplayer,tvos,Arrays,Swift,Avplayer,Tvos,不得不编辑此内容,因为我写得很混乱。 我希望创建一个数组,其中每个条目都可以用来替换函数的参数,如下所示: func playMe(inputfile: String, inputtype: String) enum InputType: String { case MP4 = "mp4" case MP3 = "mp3" case MKV = "mkv" } struct Video { let name: String let inputTyp

不得不编辑此内容,因为我写得很混乱。

我希望创建一个数组,其中每个条目都可以用来替换函数的参数,如下所示:

  func playMe(inputfile: String, inputtype: String)
enum InputType: String {
    case MP4 = "mp4"
    case MP3 = "mp3"
    case MKV = "mkv"
}

struct Video {
    let name: String
    let inputType: InputType
}

var videoArray = [
    Video(name: "Nameofvideo",  inputType: .MP4),
    Video(name: "Nameofvideo2", inputType: .MP4),
    Video(name: "Nameofvideo3", inputType: .MP4),
    Video(name: "Nameofvideo4", inputType: .MKV)
]
self.playMe(videoArray[1])

而这将取代

  inputfile: String, inputtype: String

我将如何着手创建它?我试过了

   var videoArray = [""Nameofvideo", inputtype: "mp4"", ""Nameofvideo2", inputtype: "mp4""] 
但它根本不想起作用。我错过了什么?我是不是想用一种过于复杂的方式来做这件事?我希望能和你一起出现

   playMe(videoArray[1])
然后使用audioArray[1]播放后续mp3。嗯

以下是我的playMe代码:

    override func viewDidLoad() {
        super.viewDidLoad()
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "itemDidFinishPlaying:", name: AVPlayerItemDidPlayToEndTimeNotification, object: nil)
    }

    func playMe(inputfile: String, inputtype: String) {
        let path = NSBundle.mainBundle().pathForResource(inputfile, ofType:inputtype)!
        let videoURL = NSURL(fileURLWithPath: path)
        let playerItem = AVPlayerItem(URL: videoURL)
        let player = AVPlayer(playerItem: playerItem)
        playerLayer = AVPlayerLayer(player: player)
        playerLayer.frame = self.view.bounds
        self.view.layer.addSublayer(playerLayer)
        player.play()
    }

    func itemDidFinishPlaying(notification: NSNotification) {
        playerLayer.removeFromSuperlayer()
    }

您可以使用字典数组:

 var videoArray = [["videoName":"Nameofvideo", "inputtype": "mp4"], ["videoName":"Nameofvideo2", "inputtype": "mp4"]]
最终,您可以定义两个常量,而不是重复“videoName”和“inputtype”:

static  let VideoName = "videoName"
static  let InputType = "inputtype"
并使用它们定义和访问字典中包含的值。

您可以执行以下操作:

var videoArray2 = [
    ["name": "Nameofvideo", "inputType": "mp4"],
    ["name": "Nameofvideo1", "inputType": "mp4"],
    ["name": "Nameofvideo2", "inputType": "mp4"]
]
或者更好:

struct Video {
    let name: String
    let inputType: String
}

var videoArray = [
    Video(name: "Nameofvideo", inputType: "mp4"),
    Video(name: "Nameofvideo2", inputType: "mp4"),
    Video(name: "Nameofvideo3", inputType: "mp4"),
    Video(name: "Nameofvideo4", inputType: "mp4")
]

如果可以,考虑使用EnUM类型用于<代码>输入类型< /代码>。像这样:

  func playMe(inputfile: String, inputtype: String)
enum InputType: String {
    case MP4 = "mp4"
    case MP3 = "mp3"
    case MKV = "mkv"
}

struct Video {
    let name: String
    let inputType: InputType
}

var videoArray = [
    Video(name: "Nameofvideo",  inputType: .MP4),
    Video(name: "Nameofvideo2", inputType: .MP4),
    Video(name: "Nameofvideo3", inputType: .MP4),
    Video(name: "Nameofvideo4", inputType: .MKV)
]
self.playMe(videoArray[1])
要调用
playMe:inputtype:
请编写以下内容:

let video = videoArray[1]
playMe(video.name, inputtype: video.inputType.rawValue) {
或者将您的
playMe
方法更新为:

func playMe(video: Video) {
    let path = NSBundle.mainBundle().pathForResource(video.name, ofType: video.inputType.rawValue)!
    ...
}
这样称呼它:

  func playMe(inputfile: String, inputtype: String)
enum InputType: String {
    case MP4 = "mp4"
    case MP3 = "mp3"
    case MKV = "mkv"
}

struct Video {
    let name: String
    let inputType: InputType
}

var videoArray = [
    Video(name: "Nameofvideo",  inputType: .MP4),
    Video(name: "Nameofvideo2", inputType: .MP4),
    Video(name: "Nameofvideo3", inputType: .MP4),
    Video(name: "Nameofvideo4", inputType: .MKV)
]
self.playMe(videoArray[1])
要补充的是,下面是您可以做的

enum MediaType: String {

    case mp4
    case mp3

    var description: String {
        return rawValue
    }
}

struct Media {

    var title: String
    var type: MediaType
}

let medias = [
    Media(title: "Game Of Thrones", type: .mp4),
    Media(title: "Harry Potter", type: .mp4),
    Media(title: "Coldplay Clocks", type: .mp3),
    Media(title: "In the End", type: .mp3),
]


func playMedia(media: Media) {

    if let path = NSBundle.mainBundle().pathForResource(media.title, ofType: media.type.description) {
        // play media at path
    }
}

只要与函数的调用签名完全匹配,就可以使用元组数组提供参数:

let arrayOfMedia = 
[ 
 ( "Game Of Thrones", inputtype: ".mp4"),
 ( "Harry Potter",    inputtype: ".mp4"),
 ( "Coldplay Clocks", inputtype: ".mp3"),
 ( "In the End",      inputtype: ".mp3")     
]

playMe(arrayOfMedia[0])
如果要明确表示元组数组中的第一个参数名,则需要将函数的签名更改为:


func playMe(inputfile inputfile:String,inputtype:String)

另外,考虑到类型的有限性,您可能希望创建一个具有玩家接受类型的枚举。您还应该将您的方法发布到playMecode@LeoDabus添加了播放代码和在播放停止后返回菜单所需的通知程序。您正在声明AVPlayer inside viewDidLoad方法,因此它将退出几乎立刻就存在。您必须在视图控制器类中声明该方法之外的播放器,并尽可能保持代码的可读性。在下一行结束括号,因为Swift约定很好。但是
VideoObject
应该重命名为
Video
,因为
Struct
不是对象;)无论如何,你有我的投票权。@DevranCosmoUenal:另一个改进:
Video
中的属性应该声明为
let
。事实上,他们是不应该改变的that@DevranCosmoUenal让你的enum InputType:String,并给他们一个字符串值“mp4”@appzyorlife:但这个有效:?appzYourLife:但这是有效的:?LeoDabus:updated,谢谢:)但是
Media
MediaType
是更好的名称:)谢谢@DevranCosmoUenalI将var MediaType:MediaType更改为var type:MediaType除了命名之外,你应该使用URLForResource(扩展名:)来获取文件URL,而不是文件路径谢谢@LeoDabus的建议。我遵守了一些建议,删除了playMedia代码,因为这可能与问题无关。