Проблемы с переходом на 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
сделать {попытаться} поймать { печать (ошибка = \ (ошибка))}   -  person Leo Dabus    schedule 11.06.2015
comment
Просто читая ошибки, кажется, что AVAudioSession.sharedInstance().setCategory не передает правильные аргументы (либо слишком много, либо неправильный тип). И здесь Method не переопределяет ни один метод из своего суперкласса, попробуйте удалить 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(ошибка)}   -  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