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代码,因为这可能与问题无关。