2017-06-26 115 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))" 
    } 
}