为什么这个viewcontroller需要一个intitializer?

时间:2015-05-25 05:37:56

标签: ios xcode swift

import UIKit
import MediaPlayer

我得到一个错误,说'playMusicViewController'类没有初始化器,我不确定为什么我需要在视图控制器类中使用初始化器,因为我的其他视图控制器没有视图初始化器

class playMusicViewController: UIViewController {

    var play : MPMusicPlayerController

    var selectedSong : MPMediaItemCollection

    @IBAction func play (sender: AnyObject){

        func playMusic() -> MPMusicPlayerController {

            var musicPlayer: MPMusicPlayerController = MPMusicPlayerController()

            return musicPlayer
        }

        playMusic()
    }

    override func viewDidLoad() {   
        super.viewDidLoad()

        func prepareToPlay() -> Bool{

            let myplayer = MPMusicPlayerController.applicationMusicPlayer()

            myplayer.setQueueWithItemCollection(selectedSong)

            play = myplayer

            myplayer.play()

            return true
        }}


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

}

4 个答案:

答案 0 :(得分:1)

因为每个var都应该在Swift中初始化,否则会抱怨。 如果您不想初始化变量,可以将变量设为可选变量,并且最初会为它们分配nil

var play : MPMusicPlayerController?
var selectedSong : MPMediaItemCollection?

来自Swift's Doc

  

在创建该类或结构的实例时,类和结构必须将其所有存储属性设置为适当的初始值。存储的属性不能保留在不确定的状态。

     

您可以在初始值设定项中设置存储属性的初始值,或者通过将默认属性值指定为属性定义的一部分

答案 1 :(得分:0)

在swift中,所有变量都必须在super.init之前初始化,除非声明是可选的,在你的情况下你有两个需要初始化的变量

var play : MPMusicPlayerController 
var selectedSong : MPMediaItemCollection

您可以通过声明变量optional

来避免创建初始值设定项
var play : MPMusicPlayerController?
var selectedSong : MPMediaItemCollection?

或者你可以避免必须通过事先初始化变量来创建初始化程序(如果你不需要传递任何值

var play = MPMusicPlayerController()
var selectedSong = MPMediaItemCollection()

如果您需要传递值,您也可以使用延迟初始值设定项

您可以找到有关延迟初始化here

的更多信息

答案 2 :(得分:0)

在swift中,我们必须以下列方式初始化var -

可选属性

懒惰属性

属性具有默认值

在你的情况下,你不要初始化var

var play : MPMusicPlayerController 
var selectedSong : MPMediaItemCollectio

你可以像下面那样初始化它们 -

var play : MPMusicPlayerController?
var selectedSong : MPMediaItemCollection?

var play = MPMusicPlayerController()
var selectedSong = MPMediaItemCollection()
希望它可以帮助你。

答案 3 :(得分:0)

在创建该类或结构的实例时,类和结构必须将其所有存储属性设置为适当的初始值。存储的属性不能保留在不确定的状态。

在您的情况下,playselectedSong是存储的属性。

//Snippet from your code
var play : MPMusicPlayerController
var selectedSong : MPMediaItemCollection

为了初始化playselectedSong,编译器会抛出错误,以便在使用类之前它具有初始化属性的适当位置。这就是你需要初始化的原因。

注意:添加初始化是将属性初始值分配的一种方法。有关更多方法,请参阅Initialisers