2016-06-24 69 views
1

編碼和只有學習Swift到目前爲止,在一個過程中使iOS應用程序不更新到IOS 9,當試圖轉換得到這些錯誤的過程中。我已經解決了2個,但這些都超出了我的範圍,我無法前進。請幫忙。使用Swift轉換代碼並得到了多個錯誤

import UIKit 
import AVFoundation 
class NewSoundViewController: UIViewController { 

    required init?(coder aDecoder: NSCoder) { 
     var baseString : String = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] 

     var pathComponents = [baseString, "MyAudio.m4a"] 
     var audioNSURL = NSURL.fileURLWithPathComponents(pathComponents) 
     var session = AVAudioSession.sharedInstance() 
     do { 
      try session.setCategory(AVAudioSessionCategoryPlayAndRecord) 
     } catch _ { 
     } 

     var recordSettings: [NSObject : AnyObject] = Dictionary() 
     recordSettings[AVFormatIDKey] = kAudioFormatMPEG4AAC 
     recordSettings[AVSampleRateKey] = 44100.0 
     recordSettings[AVNumberOfChannelsKey] = 2 

     self.audioRecorder = try AVAudioRecorder(URL: (audioNSURL)!, settings: recordSettings) 
     self.audioRecorder.meteringEnabled = true 
     self.audioRecorder.prepareToRecord() 
    } 

Error message in code

回答

1

以下是一些實際編譯的代碼:

class NewSoundViewController: UIViewController { 

    private var audioRecorder : AVAudioRecorder? 

    required init?(coder aDecoder: NSCoder) { 

     let session = AVAudioSession.sharedInstance() 

     do { 
      try session.setCategory(AVAudioSessionCategoryPlayAndRecord) 
     } catch _ { 
      // TODO: actually handle the error. 
     } 

     let baseString = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] 
     let pathComponents = [baseString, "MyAudio.m4a"] 
     if let audioNSURL = NSURL.fileURLWithPathComponents(pathComponents) { 

      var recordSettings = [String : AnyObject]() 
      recordSettings[AVFormatIDKey]   = Int(kAudioFormatMPEG4AAC) 
      recordSettings[AVSampleRateKey]  = 44100.0 
      recordSettings[AVNumberOfChannelsKey] = 2 

      // TODO: error handling 
      let audioRecorder = try? AVAudioRecorder(URL: audioNSURL, settings: recordSettings) 
      self.audioRecorder = audioRecorder 
      self.audioRecorder?.meteringEnabled = true 
      self.audioRecorder?.prepareToRecord() 
     } 

     // need to call super.init 
     super.init(coder: aDecoder) 
    } 
} 

注意我用let s代替了幾乎所有的var。 默認情況下,如果您需要稍後更改值,則應使所有變量爲let,並且僅使用var

還有一些其他的風格變化不一定比你寫的代碼更好,但是可以用swift編寫(如使用字典文字語法而不是顯式構造函數並使用語法)。

+0

Good call在更簡單的Int()語法上顯式創建NSNumber,因爲它會自動轉換爲NSNumber並且看起來更清晰。 –

0

你需要包裹的無符號整型值kAudioFormatMPEG4AAC在一個NSNumber把它在字典中。 AnyObject表示該值必須是一個對象。如果它是Any,那麼它可以直接保存UInt32值。所以用這個來代替:

recordSettings[AVFormatIDKey] = NSNumber(unsignedInt: kAudioFormatMPEG4AAC)

以及您的網址從NSURL.fileURLWithPathComponents(pathComponents)未來是可選的,這意味着它可能是零。 API需要一個永不爲零的值,即不是可選的值。

如果你相信它會存在,你可以使用下面的隱含解開它:

self.audioRecorder = try AVAudioRecorder(URL: audioNSURL!, settings: recordSettings)

,或者你可以做這樣的事情更安全:

if let audioNSURL = audioNSURL { 
    self.audioRecorder = try AVAudioRecorder(URL: audioNSURL, settings: recordSettings) 
} 
+0

謝謝@ eintsteinx2您的第一個問題的解決方案解決了錯誤。然而,我嘗試了你提供的第二個問題的兩個選項,我仍然得到相同的錯誤 「不能將類型[NSObject:AnyObject]的值轉換爲期望的參數類型[String:AnyObject]」 –

+0

在這種情況下,您需要聲明dictionary作爲[String:AnyObject]。所以不是'var recordSettings:[NSObject:AnyObject] = Dictionary()'use' var recordSettings:[String:AnyObject] = Dictionary()'或者甚至更好'var recordSettings = [String:AnyObject]()' –