2016-05-08 22 views
1

由於我是一個完整的初學者,我甚至不知道我是否問正確的問題。但我無法理解,爲什麼「用戶(名稱: 」約翰...)「 中的代碼for循環的一部分工作成員初始化程序如何在Structs中工作? (在斯威夫特)

CASE1 
struct User 
{ 
    let name: String 
    let company: String 
    let login: String 
    let password: String 



static let database: Dictionary<String, User> = { 
    var theDatabase = Dictionary<String, User>() 
    for user in [ 
     User(name: "John Appleseed", company: "Apple", login: "japple", password: "foo"), 
     User(name: "Madison Bumgarner", company: "World Champion San Francisco Giants", login: "madbum", password: "foo"), 
     User(name: "John Hennessy", company: "Stanford", login: "hennessy", password: "foo"), 
     User(name: "Bad Guy", company: "Criminals, Inc.", login: "baddie", password: "foo") 
    ] { 
     theDatabase[user.login] = user 
    } 
    return theDatabase 
}() 

}

,但是這並未「T

CASE2 
struct User 
    { 
let name: String 
let company: String 
let login: String 
let password: String 

    for user in User(name: "John Appleseed", company: "Apple", login: "japple", password: "foo"){ 
print(user) 

} 

}

爲了理解ħ ow CASE1作品我運行了這個代碼的簡單版本,即CASE2。儘管在兩種情況下都發生了完全相同的事情,[關於User(.. arguments ..)]我在第二種情況下出現錯誤「Declaration Expected」。 Sir Paul(斯坦福大學cs193p)表示這是一個相當簡單的數據庫,但我一直試圖找出這個問題超過6個小時。

回答

1

for-loops必須包含在閉包中。

在情況1中,您正在使用閉包聲明一個名爲database的靜態屬性。這是聲明:

static let database: Dictionary<String, User> = { 
    // This is the body of the closure 
}() 

然後您將for循環放入封閉體中。這告訴swift編譯器何時執行for循環,這是執行閉包的時候。

在情況2中,for循環在結構中。但是一個結構不是閉包。所以swift編譯器不知道何時執行for循環。

唯一可以在結構中的東西是聲明,如屬性聲明,函數聲明和結構聲明。 for循環不是一個聲明,所以這就是爲什麼編譯器抱怨它期望看到一個聲明。

情況1中的代碼工作,因爲database是屬性聲明。


但是......還有另一個問題!

For-in循環僅循環通過符合SequenceType協議的對象。這些對象的示例包括陣列和String.CharatcerView

在情況1中,for-in循環遍歷數組,符合SequenceType。請參閱[]?他們表示一個數組!在案例2中,您沒有圍繞新創建的User,因此它只是一個User,它不符合SequenceType,因此不能用於for-in循環。

爲了解決這兩個你的問題,使用此代碼:

struct User 
{ 
    let name: String 
    let company: String 
    let login: String 
    let password: String 



    static let database: Dictionary<String, User> = { 
     var theDatabase = Dictionary<String, User>() 
     for user in [ 
      User(name: "John Appleseed", company: "Apple", login: "japple", password: "foo")] { 
       theDatabase[user.login] = user 
     } 
     return theDatabase 
    }() 
} 

正如你所看到的,我加的database聲明和閉合,並添加[]各地用戶。

+0

明白了。謝謝。 – 209135

1

這很簡單。 for [collection]讓您能夠在數組,字典或其他集合上迭代。在情況1你創建用戶數組:

[ 
User(), User() 
] 

但在情況2你不。 此語法:[用戶(),用戶(),用戶()]創建一個數組。