2017-06-26 86 views
2

我創建一個全新的單一視圖的應用程序,並添加一行到viewDidLoad方法ViewController.swift文件:NSLocale.current.description崩潰在Xcode 9

override func viewDidLoad() { 
    super.viewDidLoad() 
    _ = NSLocale.current.description 
} 

NSLocale.current.description線崩潰在Xcode 9不具有堆棧跟蹤(僅EXC_BAD_ACCESS代碼= EXC_I386_GPFLT錯誤消息)。同樣的項目在Xcode 8.3.3中運行良好。任何人有任何想法,爲什麼發生這種情況?

enter image description here

這裏是我的模擬器的區域設置:

enter image description here

+1

您沒有使用VAR或讓一個錯誤。 –

+2

@LeoDabus這是有效的代碼,不應該導致運行時崩潰。 –

+0

Xcode 9的哪個版本正在運行?你正在運行的系統的區域設置是什麼? –

回答

0

這是固定在Xcode 9 Beta版5.

0

基於堆棧跟蹤,它看起來像它試圖把description作爲ObjC屬性,而不是一個斯威夫特屬性。根據source code,這不應該發生。這可能是最新的Swift編譯器中的一個bug,它正在生成Swift庫,因爲它也在iOS 9設備上崩潰。

請務必提交bug with Swift,因爲這似乎是一種語言錯誤。我已經驗證它在最新的Swift 4工具鏈中仍然存在問題。與此同時,您可以通過簡單地複製像我在此處展示的預期實現,使用自己的擴展名獲得description的相同行爲。

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // let brokenDescription = NSLocale.current.description 
     // let otherBrokenDescription = Locale.current.description 

     let objcDescription = (Locale.current as NSLocale).debugDescription //"<__NSCFLocale: 0x1c00dbc10> \'en_US\'}" 
     let myDescription = Locale.current.myDescription // "en_US (current)" 
    } 
} 

extension Locale { 
    private var _kindDescription : String { 
     if self == Locale.autoupdatingCurrent { 
      return "autoupdatingCurrent" 
     } else if self == Locale.current { 
      return "current" 
     } else { 
      return "fixed" 
     } 
    } 

    public var myDescription: String { 
     return "\(identifier) (\(_kindDescription))" 
    } 

    public var myDebugDescription : String { 
     return "\(identifier) (\(_kindDescription))" 
    } 
}