在swift中使用未解析的标识符“self”

时间:2018-04-10 19:03:34

标签: ios swift

以下是代码:

import UIKit
import SafariServices
import AVFoundation
import AWSAuthCore

class ViewController: UIViewController, SPTAudioStreamingPlaybackDelegate, SPTAudioStreamingDelegate  {
    // Variables
    var auth = SPTAuth.defaultInstance()!
    var session:SPTSession!

    // Initialzed in either updateAfterFirstLogin: (if first time login) or in viewDidLoad (when there is a check for a session object in User Defaults
    var player: SPTAudioStreamingController?
    var loginUrl: URL?

    // Outlets
    @IBOutlet weak var loginSpotify: UIButton!
    @IBOutlet weak var testLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        self.setup()
    }

    func setup () {
        // insert redirect your url and client ID below
        let redirectURL = "splitter-app://callback" // put your redirect URL here
        let clientID = "client id goes here" // put your client ID here
        auth.redirectURL     = URL(string: redirectURL)
        auth.clientID        = "client id goes here"
        auth.requestedScopes = [SPTAuthStreamingScope, SPTAuthPlaylistReadPrivateScope, SPTAuthPlaylistModifyPublicScope, SPTAuthPlaylistModifyPrivateScope]
        loginUrl = auth.spotifyWebAuthenticationURL()
        print("test")
    }

    func initializePlayer(authSession:SPTSession){
        if self.player == nil {
            self.player = SPTAudioStreamingController.sharedInstance()
            self.player!.playbackDelegate = self
            self.player!.delegate = self
            try! player!.start(withClientId: auth.clientID)
            self.player!.login(withAccessToken: authSession.accessToken)
        }

        func updateAfterFirstLogin ()  {
            loginSpotify.isHidden = true
            let userDefaults = UserDefaults.standard
            if let sessionObj:AnyObject = userDefaults.object(forKey: "SpotifySession") as AnyObject? {
                let sessionDataObj = sessionObj as! Data
                let firstTimeSession = NSKeyedUnarchiver.unarchiveObject(with: sessionDataObj) as! SPTSession
                self.session = firstTimeSession
                initializePlayer(authSession: session)
            }
        }

        func initializaPlayer(authSession:SPTSession){
            if self.player == nil {
                self.player = SPTAudioStreamingController.sharedInstance()
                self.player!.playbackDelegate = self
                self.player!.delegate = self
                try! player?.start(withClientId: auth.clientID)
                self.player!.login(withAccessToken: authSession.accessToken)
            }
        }
    }
}

func audioStreamingDidLogin(_ audioStreaming: SPTAudioStreamingController!) {
    // after a user authenticates a session, the SPTAudioStreamingController is then initialized and this method called
    print("logged in")
    self.player?.playSpotifyURI("spotify:track:58s6EuEYJdlb0kO7awm3Vp", startingWith: 0, startingWithPosition: 0, callback: { (error) in
        if (error != nil) {
            print("playing!")
        }
    })
}

错误在第91行.Xcode说:

  

“使用未解析的标识符'self'”

但是我在代码中的多个不同位置使用了相同的变量,并且它在类的顶部声明。为什么它在这个特定的行上给我一个错误?我试过把它变成一个懒惰的变量,正如网上其他人所建议的那样,但Xcode告诉我懒惰的变量需要初始化,我不知道该怎么做。

1 个答案:

答案 0 :(得分:1)

代码的格式化让人很难看到发生了什么,但看起来像函数audioStreamingDidLogin(:SPTAudioStreamingController!)不是类函数。也许是全球性的,因为它是在自我可用的课堂之外宣布的。

您可以:

  • 将其移入课堂
  • 将ViewController的一些实例作为参数传递给方法

将它移到课堂上对我来说最有意义。

编辑:修复代码

class ViewController: UIViewController, SPTAudioStreamingPlaybackDelegate, SPTAudioStreamingDelegate  {
    // Variables
    var auth = SPTAuth.defaultInstance()!
    var session:SPTSession!

    // Initialzed in either updateAfterFirstLogin: (if first time login) or in viewDidLoad (when there is a check for a session object in User Defaults
    var player: SPTAudioStreamingController?
    var loginUrl: URL?

    // Outlets
    @IBOutlet weak var loginSpotify: UIButton!
    @IBOutlet weak var testLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        self.setup()
    }

    func setup () {
        // insert redirect your url and client ID below
        let redirectURL = "splitter-app://callback" // put your redirect URL here
        let clientID = "client id goes here" // put your client ID here
        auth.redirectURL     = URL(string: redirectURL)
        auth.clientID        = "client id goes here"
        auth.requestedScopes = [SPTAuthStreamingScope, SPTAuthPlaylistReadPrivateScope, SPTAuthPlaylistModifyPublicScope, SPTAuthPlaylistModifyPrivateScope]
        loginUrl = auth.spotifyWebAuthenticationURL()
        print("test")
    }

    func initializePlayer(authSession:SPTSession){
        if self.player == nil {
            self.player = SPTAudioStreamingController.sharedInstance()
            self.player!.playbackDelegate = self
            self.player!.delegate = self
            try! player!.start(withClientId: auth.clientID)
            self.player!.login(withAccessToken: authSession.accessToken)
        }
    }

    func updateAfterFirstLogin ()  {
        loginSpotify.isHidden = true
        let userDefaults = UserDefaults.standard
        if let sessionObj:AnyObject = userDefaults.object(forKey: "SpotifySession") as AnyObject? {
            let sessionDataObj = sessionObj as! Data
            let firstTimeSession = NSKeyedUnarchiver.unarchiveObject(with: sessionDataObj) as! SPTSession
            self.session = firstTimeSession
            initializePlayer(authSession: session)
        }
    }

    func initializaPlayer(authSession:SPTSession){
        if self.player == nil {
            self.player = SPTAudioStreamingController.sharedInstance()
            self.player!.playbackDelegate = self
            self.player!.delegate = self
            try! player?.start(withClientId: auth.clientID)
            self.player!.login(withAccessToken: authSession.accessToken)
        }
    }

    func audioStreamingDidLogin(_ audioStreaming: SPTAudioStreamingController!) {
        // after a user authenticates a session, the SPTAudioStreamingController is then initialized and this method called
        print("logged in")
        self.player?.playSpotifyURI("spotify:track:58s6EuEYJdlb0kO7awm3Vp", startingWith: 0, startingWithPosition: 0, callback: { (error) in
            if (error != nil) {
                print("playing!")
            }
        })
    }
}