2015-01-04 38 views
0
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** 

在調試窗口中,它顯示titlesForTip,包括3個元素並顯示在titlesForTip [0] ... titlesForTip [2]中,但我無法通過[]訪問它。如何在Swift中迭代NSString?

它運行在Xcode 6.1.1中,我不知道如何迭代它。我的代碼: var titlesForTip:[NSString]? = defaults.objectForKey(「titleForTipSegment」)as? [NSString] if(titlesForTip?== nil || titlesForTip!== [])//檢查應用程序的第一次運行 titlesForTip = [「18%」,「20%」,「22%」]//默認值 } 當沒有任何內容時,objectForKey將返回null數組,因此titlesForTip == nil永遠不會發生。

+1

titlesForTip是可選的。你需要解開它。 –

回答

1

您已創建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 
+0

謝謝,太棒了。在C/C++世界裏,如果(a = b)總是生成真實的,我不知道爲什麼用這種方式快速工作,儘管它在a = b前面添加了一個let。 –

+0

Swift的'if let a = b'模式是一種將可選項的測試與nil組合起來的方法,並且可以在同一時間解開可選項(如果有的話)中的值。 –

0

正如你已經被告知,這是僅僅因爲你的陣列被包裹在可選的 - 因爲你包裹它的可選使用as?操作。這是可以做的,並且是一個明智的想法,因爲它是安全的。但你必須解開它:

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... 
} 

但是,實際上沒有必要進行任何的該代碼,因爲不需要檢查零並提供默認值。相反,請致電registerDefaults: - 這就是它的用途。這樣,objectForKey("titleForTipSegment")總是有一個[NSString]價值,你可以無條件地投。

+0

謝謝,我以這種方式完成它,它會安全嗎? titlesForTip = defaults.objectForKey(「titleForTipSegment」)as? NSMutableArray if(titlesForTip?== nil || titlesForTip!== [])//檢查應用程序的第一次運行 titlesForTip = [0.18,0.20,0.22]; } –

+0

我想是的,但這不是提供首次運行默認值的理想方式。調用'registerDefaults:';這就是它的目的。這樣,就會有這個鍵的對象,你根本不需要檢查零。在這裏看到我的答案:http://stackoverflow.com/a/15991061/341994 – matt

+0

添加了'registerDefaults:'提到我的答案。 – matt