如何在 Swift 中迭代 NSString?
How to iterate NSString in Swift?
var defaults = NSUserDefaults.standardUserDefaults();
var titlesForTip : [NSString]? = defaults.objectForKey("titleForTipSegment") as? [NSString]
if titlesForTip == nil //Check for first run of app
{
titlesForTip = ["18%", "20%", "22%"]; //Default value
}
// it is ok to get first and last elements
println( titlesForTip?.first)
for item in titlesForTip {//**error [NSString]? does not have a member named Generator**
println(item)
}
//**error type [NSString]? does not conform to protocol sequence type**
for (var index, var value) in enumerate(titlesForTip) {
println("Item \(index + 1): \(value)")
}
titlesForTip[1];//**error [NSString]? does not have a member named subscript**
在调试中 window 它显示包含 3 个元素的 titlesForTip 并显示在 titlesForTip[0]... titlesForTip[2],但我无法使用 [].
访问它
它在Xcode 6.1.1 中运行,我不知道如何迭代它。
我的代码出错:
var titlesForTip : [NSString]? = defaults.objectForKey("titleForTipSegment") 作为? [NSString]
if (titlesForTip? == nil || titlesForTip! == []) //检查应用程序的首次运行
{
titlesForTip = ["18%", "20%", "22%"] //默认值
}
当什么都没有时,objectForKey 将 return 为 null 数组,因此永远不会出现 titlesForTip ==nil。
您已将 titlesForTip
创建为可选,其中可能包含 NSStrings
的数组。因此,在访问其元素或对其进行迭代之前,您需要通过展开它来检查它是否包含任何内容。
使用类似这样的代码:
var defaults = NSUserDefaults.standardUserDefaults()
var titlesForTip : [NSString]? = defaults.objectForKey("titleForTipSegment") as? [NSString]
if titlesForTip == nil //Check for first run of app
{
titlesForTip = ["18%", "20%", "22%"] //Default value
}
if let unwrappedTitlesForTip = titlesForTip {
// it is ok to get first and last elements
println( unwrappedTitlesForTip.first)
for item in unwrappedTitlesForTip {
println(item)
}
for (var index, var value) in enumerate(unwrappedTitlesForTip) {
println("Item \(index + 1): \(value)")
}
unwrappedTitlesForTip[1] // need to do something with this, won't work just on a line on its own
}
或者,您可以将其设置为不使用可选值,方法是首先设置默认值,如果您从 NSDefaults 获得某些内容,则覆盖它,如下所示:
var defaults = NSUserDefaults.standardUserDefaults()
var titlesForTip : [NSString] = ["18%", "20%", "22%"]
if let storedValue = defaults.objectForKey("titleForTipSegment") as? [NSString] {
titlesForTip = storedValue
}
// it is ok to get first and last elements
println( titlesForTip.first)
for item in titlesForTip {
println(item)
}
for (var index, var value) in enumerate(titlesForTip) {
println("Item \(index + 1): \(value)")
}
titlesForTip[1] // need to do something with this, won't work just on a line on its own
如您所知,这仅仅是因为您的数组被包装在 Optional 中 - 因为 you 使用 as?
运算符将其包装在 Optional 中。这样做没关系,而且是一个明智的主意,因为它很安全。但是你必须打开它:
var titlesForTip : [NSString]? // "wrap me in an Optional"
titlesForTip = ["18%", "20%", "22%"]
for item in titlesForTip! { // "unwrap me"
println(item)
}
在你的实际代码中,我会做的是使用条件绑定来解包:
var titlesForTip : [NSString]? =
defaults.objectForKey("titleForTipSegment") as? [NSString]
if let titlesForTip = titlesForTip { "unwrap me safely"
// ...here, titlesForTip is unwrapped and safe to use...
}
然而,实际上不需要任何代码,因为不需要检查 nil 并提供默认值。相反,调用 registerDefaults:
- 这就是它的用途。这样,objectForKey("titleForTipSegment")
将 总是 有一个 [NSString]
值,你可以无条件地转换。
var defaults = NSUserDefaults.standardUserDefaults();
var titlesForTip : [NSString]? = defaults.objectForKey("titleForTipSegment") as? [NSString]
if titlesForTip == nil //Check for first run of app
{
titlesForTip = ["18%", "20%", "22%"]; //Default value
}
// it is ok to get first and last elements
println( titlesForTip?.first)
for item in titlesForTip {//**error [NSString]? does not have a member named Generator**
println(item)
}
//**error type [NSString]? does not conform to protocol sequence type**
for (var index, var value) in enumerate(titlesForTip) {
println("Item \(index + 1): \(value)")
}
titlesForTip[1];//**error [NSString]? does not have a member named subscript**
在调试中 window 它显示包含 3 个元素的 titlesForTip 并显示在 titlesForTip[0]... titlesForTip[2],但我无法使用 [].
访问它它在Xcode 6.1.1 中运行,我不知道如何迭代它。
我的代码出错: var titlesForTip : [NSString]? = defaults.objectForKey("titleForTipSegment") 作为? [NSString] if (titlesForTip? == nil || titlesForTip! == []) //检查应用程序的首次运行 { titlesForTip = ["18%", "20%", "22%"] //默认值 } 当什么都没有时,objectForKey 将 return 为 null 数组,因此永远不会出现 titlesForTip ==nil。
您已将 titlesForTip
创建为可选,其中可能包含 NSStrings
的数组。因此,在访问其元素或对其进行迭代之前,您需要通过展开它来检查它是否包含任何内容。
使用类似这样的代码:
var defaults = NSUserDefaults.standardUserDefaults()
var titlesForTip : [NSString]? = defaults.objectForKey("titleForTipSegment") as? [NSString]
if titlesForTip == nil //Check for first run of app
{
titlesForTip = ["18%", "20%", "22%"] //Default value
}
if let unwrappedTitlesForTip = titlesForTip {
// it is ok to get first and last elements
println( unwrappedTitlesForTip.first)
for item in unwrappedTitlesForTip {
println(item)
}
for (var index, var value) in enumerate(unwrappedTitlesForTip) {
println("Item \(index + 1): \(value)")
}
unwrappedTitlesForTip[1] // need to do something with this, won't work just on a line on its own
}
或者,您可以将其设置为不使用可选值,方法是首先设置默认值,如果您从 NSDefaults 获得某些内容,则覆盖它,如下所示:
var defaults = NSUserDefaults.standardUserDefaults()
var titlesForTip : [NSString] = ["18%", "20%", "22%"]
if let storedValue = defaults.objectForKey("titleForTipSegment") as? [NSString] {
titlesForTip = storedValue
}
// it is ok to get first and last elements
println( titlesForTip.first)
for item in titlesForTip {
println(item)
}
for (var index, var value) in enumerate(titlesForTip) {
println("Item \(index + 1): \(value)")
}
titlesForTip[1] // need to do something with this, won't work just on a line on its own
如您所知,这仅仅是因为您的数组被包装在 Optional 中 - 因为 you 使用 as?
运算符将其包装在 Optional 中。这样做没关系,而且是一个明智的主意,因为它很安全。但是你必须打开它:
var titlesForTip : [NSString]? // "wrap me in an Optional"
titlesForTip = ["18%", "20%", "22%"]
for item in titlesForTip! { // "unwrap me"
println(item)
}
在你的实际代码中,我会做的是使用条件绑定来解包:
var titlesForTip : [NSString]? =
defaults.objectForKey("titleForTipSegment") as? [NSString]
if let titlesForTip = titlesForTip { "unwrap me safely"
// ...here, titlesForTip is unwrapped and safe to use...
}
然而,实际上不需要任何代码,因为不需要检查 nil 并提供默认值。相反,调用 registerDefaults:
- 这就是它的用途。这样,objectForKey("titleForTipSegment")
将 总是 有一个 [NSString]
值,你可以无条件地转换。