Проблеми с миграцията на Swift 2

Току-що отворих стария си проект в Xcode 7 бета. Кодът работи перфектно в Xcode 6, но сега показва много грешки. Не знам какви са те. Може ли някой да обясни защо това се случи и как да го поправя? Благодаря ви! Ето кода

import UIKit
import AVFoundation
class ViewController: UIViewController {

    var player: AVAudioPlayer = AVAudioPlayer()
    @IBOutlet weak var firstCardImageView: UIImageView!
    @IBOutlet weak var secondCardImageView: UIImageView!
    @IBOutlet weak var label: UILabel!


    var cardNamesArray:[String] = ["dice1","dice2","dice3","dice4","dice5","dice6"]
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func rollaction(sender: AnyObject) {
        updateAction()
    }

    func updateAction(){
        var firstRandomNumber = Int(arc4random_uniform(5))
        var firstCardString:String = String(self.cardNamesArray[firstRandomNumber])
        var secondRandomNumber = Int(arc4random_uniform(5))
        var secondCardString:String = String(self.cardNamesArray[secondRandomNumber])

        self.firstCardImageView.image = UIImage(named: firstCardString)
        self.secondCardImageView.image = UIImage(named: secondCardString)



        var fileLocation = NSBundle.mainBundle().pathForResource("sound", ofType: ".mp3")

        var error: NSError? = nil

        player = AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: fileLocation!), error: &error) //Error: Cannot find an initializer for type 'AVAudioPlayer' that accepts an argument list of type '(contentsOfURL: NSURL, error: inout NSError?)'

        AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient, error: nil) //Error:Extra argument 'error' in call
        AVAudioSession.sharedInstance().setActive(true, error: nil) //Error:Extra argument 'error' in call
        player.play()


        let num = firstRandomNumber + secondRandomNumber + 2
        self.label.text = "The sum is \(num)"
    }


       override func motionEnded(motion: UIEventSubtype, withEvent event: UIEvent) {

        if event.subtype == UIEventSubtype.MotionShake { //Error:Method does not override any method from its superclass


            updateAction()


        }
    }


}

person Jerry Xu    schedule 11.06.2015    source източник
comment
Можете ли да покажете съобщенията за грешка?   -  person joel goldstick    schedule 11.06.2015
comment
Това е коментирано в кода. но тук са грешките. //Грешка: Не може да се намери инициализатор за тип „AVAudioPlayer“, който приема списък с аргументи от тип „(contentsOfURL: NSURL, грешка: inout NSError?)“ //Грешка: Допълнителен аргумент „грешка“ при повикване //Грешка: Методът прави не отменя нито един метод от неговия суперклас   -  person Jerry Xu    schedule 11.06.2015
comment
Опитвали ли сте да използвате инструмента за миграция от Swift 1.2 към Swift 2?   -  person JAL    schedule 11.06.2015
comment
да Но аз не решавам това :(   -  person Jerry Xu    schedule 11.06.2015
comment
do { try } catch { print(error = \(error)) }   -  person Leo Dabus    schedule 11.06.2015
comment
Само като прочетем грешките, изглежда, че AVAudioSession.sharedInstance().setCategory не предава правилните аргументи (или твърде много, или неправилен тип). И тук Методът не заменя нито един метод от неговия суперклас, опитайте да премахнете override от функцията. От моя опит, мигрирането на код от Swift 1.x към Swift 1.2 беше главоболие и ни отне цял ден, за да го оправим. Споменах ли, че инструментът за мигриране не поправи всичко? Но мигрира повечето. Спомням си над 70 червени проблема за ръчно отстраняване.   -  person bauerMusic    schedule 11.06.2015
comment
do { player = try AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: fileLocation!))} catch {print(error)}   -  person Leo Dabus    schedule 11.06.2015
comment
Опитах се да премахна замяната. След това ми дава нова грешка: Методът 'motionEnded(:withEvent:)' с Objective-C селектор 'motionEnded:withEvent:' е в конфликт с метода 'motionEnded(:withEvent:)' от суперклас 'UIResponder ' със същия Objective-C селектор   -  person Jerry Xu    schedule 11.06.2015


Отговори (1)


Ето вашата функция updateAction() с реализацията do/try/catch на Swift 2.0:

func updateAction(){
    var firstRandomNumber = Int(arc4random_uniform(5))
    var firstCardString:String = String(self.cardNamesArray[firstRandomNumber])
    var secondRandomNumber = Int(arc4random_uniform(5))
    var secondCardString:String = String(self.cardNamesArray[secondRandomNumber])

    self.firstCardImageView.image = UIImage(named: firstCardString)
    self.secondCardImageView.image = UIImage(named: secondCardString)

    let fileLocation = NSBundle.mainBundle().pathForResource("sound", ofType: ".mp3")

    do {
        player = try AVAudioPlayer(contentsOfURL: NSURL(fileURLWithPath: fileLocation!))

        try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient)
        try AVAudioSession.sharedInstance().setActive(true)
    }
    catch {
        print("Something bad happened. Try catching specific errors to narrow things down")
    }

    player.play()

    let num = firstRandomNumber + secondRandomNumber + 2
    self.label.text = "The sum is \(num)"
}
person Sidetalker    schedule 14.06.2015