操场上的 NSMutableArray 导致 Xcode 7 出现错误

Posted

技术标签:

【中文标题】操场上的 NSMutableArray 导致 Xcode 7 出现错误【英文标题】:NSMutableArray in playground causing errors with Xcode 7 【发布时间】:2015-09-15 15:01:30 【问题描述】:

我有一个类可以获取所有国家/地区代码,并且应该按字母顺序对它们进行排序。该类在 Xcode for ios 中运行良好,但是当我复制它以在操场上测试它时出现错误。见图片。

所以我剥离了所有代码,发现 NSMutableArray 没有正确声明,所以将它们更改为这个。

var countries:NSMutableArray = NSMutableArray()
var countryKeys:NSMutableArray = NSMutableArray()
var countryNames:NSMutableArray = NSMutableArray() 

它消除了错误,但代码不会运行。没有错误也没有输出。

有人知道为什么这段代码不能在操场上运行吗?是bug吗?

这里有完整的代码

struct countryCodes
    var countries:NSMutableArray = NSMutableArray()
    var countryKeys:NSMutableArray = NSMutableArray()
    var countryNames:NSMutableArray = NSMutableArray()

    init()
        for code in NSLocale.ISOCountryCodes() 
            let id = NSLocale.localeIdentifierFromComponents([NSLocaleCountryCode: code])
            let name = NSLocale(localeIdentifier: "en_UK").displayNameForKey(NSLocaleIdentifier, value: id) ?? "Country not found for code: \(code)"
            self.countries.addObject(["key":id,"value":name])
        
        self.sortByValue()
    

    private func sortByValue()
        let descriptor: NSSortDescriptor = NSSortDescriptor(key: "value", ascending: true)
        extractToArrays(self.countries.sortedArrayUsingDescriptors([descriptor]))
    

    private func extractToArrays(sortedCountries:NSArray)
        for item in self.countries
            self.countryKeys.addObject(item["key"] as! String)
            self.countryNames.addObject(item["value"] as! String)
        
    

我尝试打开一个新的游乐场,但立即出现错误

//: Playground - noun: a place where people can play

import UIKit

var str = "Hello, playground"

错误

file:///Volumes/External/Xcode%20Projects/MyPlayground3.playground/:错误:Playground 执行中止:执行被中断,原因:EXC_BAD_ACCESS(代码=1,地址=0x8)。

【问题讨论】:

请发布您的代码,以便我们进行测试。 为我工作 (screenshot)... 你为什么使用NSMutableArray而不是Swift数组?我认为这让事情变得比需要的更难。 @EricD。无法查看您的屏幕截图。我没有 Evernote 帐户。有趣的是为什么它不在我的操场上运行。会不会是某种配置问题? @AlMartin screenshot 【参考方案1】:

几厘米。

首先,值名称应以大写字母开头:

struct CountryCodes 

避开像NSArrayNSDictionary 这样的无类型集合。只需使用本机 Swift 集合类型。所以countries 将是一个[String : String] 的数组:

    var countries = [[String : String]]()

在初始化时,我们需要创建数组,并对其进行排序。

    init() 
        for code in NSLocale.ISOCountryCodes() 
            let id = NSLocale.localeIdentifierFromComponents([NSLocaleCountryCode : code])

Swift Optionals 表示数据是否存在。因此,如果数据 not 存在,那么在数据模型中插入这样的字符串是一种不好的做法。相反,使用guard 来处理这种情况:

            guard let name = NSLocale(localeIdentifier: "en_UK").displayNameForKey(NSLocaleIdentifier, value: id) else 
                debugPrint("Country not found for code: \(code)")
                break;
            

获得键和值后,将它们附加到国家/地区数组中:

            countries += [["key":id, "value":name]]
        

现在您已经拥有了所有这些,按值排序:

        countries = countries.sort()  $0["value"] < $1["value"] 
    

使用map 可以快速计算键和国家名称 - 无需将它们存储在单独的数组中:

    var keys : [String] 
        return countries.map  $0["key"]! 
    

    var names : [String] 
        return countries.map  $0["value"]! 
    

如果你想在操场上尝试,这里是完整的代码:

struct CountryCodes 
    var countries = [[String : String]]()

    init() 
        for code in NSLocale.ISOCountryCodes() 
            let id = NSLocale.localeIdentifierFromComponents([NSLocaleCountryCode : code])

            guard let name = NSLocale(localeIdentifier: "en_UK").displayNameForKey(NSLocaleIdentifier, value: id) else 
                debugPrint("Country not found for code: \(code)")
                break;
            

            countries += [["key":id, "value":name]]
        

        countries = countries.sort()  $0["value"] < $1["value"] 
    

    var keys : [String] 
        return countries.map  $0["key"]! 
    

    var names : [String] 
        return countries.map  $0["value"]! 
    


let codes = CountryCodes()
codes.countries
codes.keys
codes.names

请注意,此代码未使用强制转换 (as!),这会由于逻辑错误而导致崩溃。唯一使用的强制运算符 (!) 在 keysnames getter 中。

【讨论】:

谢谢。当我的操场可以正常工作时,我会进行测试。 下载最新的 Xcode 7 测试版后,我很高兴地说它现在可以工作了。你的代码也是如此。您还解决了我没有按字母顺序对名称进行排序的问题。谢谢你..

以上是关于操场上的 NSMutableArray 导致 Xcode 7 出现错误的主要内容,如果未能解决你的问题,请参考以下文章

操场上的 UIView

从 NSMutableDictionary 构建 NSMutableArray 导致 NSException

操场上的 Swift AVFoundation 不输出声音

你如何从操场上的笔尖获得视野?

tableview 是空的,但我看到操场上的数据来自 urlsession

0xc00000ba失败怎么办?