操场上的 NSMutableArray 导致错误 Xcode 7
NSMutableArray in playground causing errors with Xcode 7
我有一个 class 可以获取所有国家代码,并且应该按字母顺序对它们进行排序。 class 运行 在 Xcode 中对于 ios 很好,但是当我复制它以在操场上测试它时,我得到一个错误。见图。
所以我剥离了所有代码,发现 NSMutableArray 没有正确声明,所以将它们更改为这个。
var countries:NSMutableArray = NSMutableArray()
var countryKeys:NSMutableArray = NSMutableArray()
var countryNames:NSMutableArray = NSMutableArray()
它消除了错误,但代码不会 运行。没有错误也没有输出。
有人知道为什么这段代码不会 运行 在 playground 中吗?这是一个错误吗?
完整代码在这里
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/:错误:游乐场执行中止:执行被中断,原因:EXC_BAD_ACCESS(代码=1,地址=0x8) .
一些评论。
首先,值名称应以大写字母开头:
struct CountryCodes {
避开 NSArray
和 NSDictionary
等无类型集合。只需使用本机 Swift 集合类型。所以 countries
将是 [String : String]
:
的数组
var countries = [[String : String]]()
在初始化中,我们需要创建数组,并对它进行排序。
init() {
for code in NSLocale.ISOCountryCodes() {
let id = NSLocale.localeIdentifierFromComponents([NSLocaleCountryCode : code])
Swift 可选值表示数据是否存在。因此,如果那里的数据是 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() { [=15=]["value"] < ["value"] }
}
可以使用 map
快速计算键和国家/地区名称 - 无需将它们存储在单独的数组中:
var keys : [String] {
return countries.map { [=16=]["key"]! }
}
var names : [String] {
return countries.map { [=16=]["value"]! }
}
}
如果您想在 playground 中尝试,请查看完整代码:
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() { [=17=]["value"] < ["value"] }
}
var keys : [String] {
return countries.map { [=17=]["key"]! }
}
var names : [String] {
return countries.map { [=17=]["value"]! }
}
}
let codes = CountryCodes()
codes.countries
codes.keys
codes.names
请注意,此代码未使用强制转换 (as!
),这会因逻辑错误而导致崩溃。唯一使用的力运算符 (!
) 在 keys
和 names
吸气剂中。
我有一个 class 可以获取所有国家代码,并且应该按字母顺序对它们进行排序。 class 运行 在 Xcode 中对于 ios 很好,但是当我复制它以在操场上测试它时,我得到一个错误。见图。
所以我剥离了所有代码,发现 NSMutableArray 没有正确声明,所以将它们更改为这个。
var countries:NSMutableArray = NSMutableArray()
var countryKeys:NSMutableArray = NSMutableArray()
var countryNames:NSMutableArray = NSMutableArray()
它消除了错误,但代码不会 运行。没有错误也没有输出。
有人知道为什么这段代码不会 运行 在 playground 中吗?这是一个错误吗?
完整代码在这里
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/:错误:游乐场执行中止:执行被中断,原因:EXC_BAD_ACCESS(代码=1,地址=0x8) .
一些评论。
首先,值名称应以大写字母开头:
struct CountryCodes {
避开 NSArray
和 NSDictionary
等无类型集合。只需使用本机 Swift 集合类型。所以 countries
将是 [String : String]
:
var countries = [[String : String]]()
在初始化中,我们需要创建数组,并对它进行排序。
init() {
for code in NSLocale.ISOCountryCodes() {
let id = NSLocale.localeIdentifierFromComponents([NSLocaleCountryCode : code])
Swift 可选值表示数据是否存在。因此,如果那里的数据是 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() { [=15=]["value"] < ["value"] }
}
可以使用 map
快速计算键和国家/地区名称 - 无需将它们存储在单独的数组中:
var keys : [String] {
return countries.map { [=16=]["key"]! }
}
var names : [String] {
return countries.map { [=16=]["value"]! }
}
}
如果您想在 playground 中尝试,请查看完整代码:
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() { [=17=]["value"] < ["value"] }
}
var keys : [String] {
return countries.map { [=17=]["key"]! }
}
var names : [String] {
return countries.map { [=17=]["value"]! }
}
}
let codes = CountryCodes()
codes.countries
codes.keys
codes.names
请注意,此代码未使用强制转换 (as!
),这会因逻辑错误而导致崩溃。唯一使用的力运算符 (!
) 在 keys
和 names
吸气剂中。