如何在 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] 值,你可以无条件地转换。