2016-06-15 58 views
1

過去三週我一直在學習iOS開發,目前我正在關注Udemy的課程。在Swift 2.0中填充列表並顯示結果

但是我正在關注其中一個講座,我們建立了一個Instagram克隆。

使用三個數組把作爲教練如下:

var usernames = [""] // Stores all usernames 
var userIds = [""] // Stores all Id's of the given usernames 
var isFollowing = [false] // Stores where or not you're following that user 

要我試圖跟蹤哪些用戶id與中有哪些使用兩個陣列的用戶名基本上是一個意外隨時會發生,所以我決定把關閉並找到一個更可行的方法。我恢復到我的.Net天,並決定建立一個列表,所以我去創建一個類,如下所示:

class Users{ 
    var Username : NSString = "" 
    var UserId : NSString = "" 
    var Following : Bool = false 
} 

現在在我的ViewController我打個電話來解析返回我的用戶,我的列表「通過響應中號基本上是試圖循環,並將其添加到列表中的類如下所示:

var t = [Users]() // After googling the web, this seems to be the syntax for a list declaration ? 
    let u = Users() 

    for object in users{ 

    if let o = object as? PFUser { 

     u.Username = o.username! 
     u.UserId = o.objectId! 
     u.Following = o.IsFollowing! 

     self.t.append(u) 

     } 

    } 

print(self.t) 

現在,當我打印此控制檯我看到以下內容:

ParseStarterProject_Swift.Users

由於我目前有一個用戶,但是當我嘗試循環T並在控制檯中顯示用戶名時,它不顯示任何內容。

for x in t { 

    print(x.Username) 

} 

請隨身攜帶,因爲我是新來的Swift,所以我的語法可能不正確。

+1

其他需要考慮的是將PFUser對象存儲在數組中而不是創建另一個對象。如果您存儲PFUser,則可以輕鬆更新屬性(如'isFollowing)並保存。如果您不存儲PFUser,那麼您需要再次獲取PFUser,對其進行修改並保存。 – Paulw11

回答

2

你的基本直覺是正確的,最好是有一個自定義對象的數組,而不是多個數組。

關於使其更加Swifty,請考慮您的Users類型。你可能想是這樣的:

struct User { 
    let username: String 
    let userId: String 
    let following: Bool 
} 

注意,

  • 屬性名應當以小寫字母開頭;
  • Users應該可能被稱爲User,因爲它代表一個用戶;
  • 我們通常不會將值初始化爲默認值,而是在初始化程序中指定它們;
  • 我們可能使用String而不是NSString;
  • 如果一個屬性不能改變,你會使用let,而不是var;
  • 屬性以小寫字母開頭;

然後,你可以這樣做:

var t = [User]() 

for object in users { 
    if let o = object as? PFUser { 
     t.append(User(username: o.username!, userId: o.objectId!, following: o.IsFollowing!) 
    } 
} 

print(t) 

顯然,與所有那些!被迫展開運營商,你要相信,這些領域被填充,所有這些屬性。


使用struct是不錯的,因爲(一)這是一個值類型; (b)免費獲得初始化程序;和(c)你可以打印它們。如果你真的想User爲引用類型(class),你會做這樣的事情:

class User { 
    let username: String 
    let userId: String 
    let following: Bool 

    init(username: String, userId: String, following: Bool) { 
     self.username = username 
     self.userId = userId 
     self.following = following 
    } 
} 

如果你希望能夠只print他們,你把它定義爲符合CustomStringConvertible

extension User: CustomStringConvertible { 
    var description: String { return "<User; username = \(username); userId = \(userId); following = \(following)>" } 
} 

隨着階級,你可以隨意改變description計算屬性來顯示它在任何你想要的格式,但它描述了一個思路。

+0

優秀的細分,並感謝您的額外信息。 –

1

在考慮跟蹤userId使用兩個數組的用戶名是否危險的情況下,您正確地考慮了使用您的方法的正確方向。

首先,我只是想建議你使用正確的命名約定:

  1. 類應爲單數(除非是非常特殊的情況下)。
  2. 變量/屬性名稱應該以小寫字母開頭。

這將意味着你的用戶類應該是這樣的:

class User { 
    var username : NSString = "" 
    var userId : NSString = "" 
    var following : Bool = false 
} 

我會繼續爲下一部分現有的命名使用。你的代碼的主要問題是變量「u」是你創建一次然後修改它的對象。您應該爲每個用戶創建一個新的「用戶」對象,而不是修改原始對象。如果你不這樣做,你只需要多次使用同一個用戶的數組。這是你的代碼是如何將現在看:

var t = [Users]() 

    for object in users { 

    if let o = object as? PFUser { 

     let u = Users() 

     u.Username = o.username! 
     u.UserId = o.objectId! 
     u.Following = o.IsFollowing! 

     self.t.append(u) 

    } 

    } 

print(self.t) 

接下來你提到,當你打印到控制檯,您看到的文字:ParseStarterProject_Swift.Users,那是因爲斯威夫特不會自動打印您的對象的內容相當的文字。爲了打印更詳細的內容,您的「用戶」對象需要執行CustomStringConvertible。你可以在這裏看到更詳細的答案:how-can-i-change-the-textual-representation-displayed-for-a-type-in-swif

最後,你提到當你循環低谷「t」並在控制檯顯示用戶名時,它不會顯示任何東西。這是由以下兩種情況之一引起的:

  1. 因爲沒有用戶從解析返回,所以「t」數組實際上是空的。嘗試print(t.count)以查看陣列中有多少個對象。
  2. 因爲您的「用戶」對象聲明一個空字符串「」作爲默認用戶名,並且從解析中獲取數據時用戶名未被正確設置。這意味着它實際上正在打印某些東西,只是它是一個空字符串。嘗試定義一個不同的默認值,如var username : NSString = "Undefined"以查看它是否打印某些內容。

祝你好運學得快!