2016-07-25 23 views
0

我看到一些使用User.swift或Post.swift的開發者。它的用途是什麼以及爲什麼每個開發者都擁有它。Swift什麼是模型文件用於以及它如何工作?

一些代碼,我在網上找到https://github.com/dasoga/chat-firebase/blob/master/ChatRealTime/Model/User.swift

import UIKit 

class User: NSObject { 
var id: String? 
var name: String? 
var email: String? 
var profileImageUrl: String? 
} 
+0

提供指向原始代碼的鏈接。另外你的問題太模糊了:「它是什麼以及它是如何工作的」都是開放式的。 – matt

回答

1

模型類的想法是封裝在自己的課堂上使用的應用程序中的數據,提供了從控制器和視圖模型的清晰分離。請參閱Model-View-Controller Apple的可可核心能力。或參閱Model object

但是拋開這些更廣泛的設計原則,讓我們考慮一下您的User類:這是一個封裝了一系列屬性的類,即一個標識符,名稱,電子郵件地址和圖像URL。那麼,爲什麼使用User類型,而不是單個屬性和/或標準集合?

讓我們考慮的替代方案,這是說明爲什麼像User一個模型對象可以是強大的:

  • 考慮其維持的用戶列表的應用程序。 User對象的數組是更爲方便比,說的標識,名稱,電子郵件等。例如,如果你想用戶進行排序的名字列表什麼單獨的陣列?如果你將所有這些屬性放在不同的陣列中,跟蹤它們將會非常複雜。

  • 所以,讓我們說,你認識到,保持這些各種屬性都在一起是強大的,所以你決定使用簡單的字典來做到這一點。然後一組用戶可以表示爲一個字典數組。這解決了以前的問題。

    但它引入了其他問題。例如,它現在是在你有責任,程序員,使用正確的按鍵本字典,編譯器不能爲您提供任何線索,它預計什麼這個字典中的鍵應該是,更不用說任何規則管理與這些密鑰相關的數據類型。

    更糟的是,你可能會與此User對象相關的業務規則,即idname可能是必需的,但該電子郵件地址和圖片URL是可選的。此外,您可能希望將一些業務規則應用於電子郵件地址和URL以確保其有效。或者您可能會說可以更改用戶的姓名或電子郵件地址,但不要更改他們的id。這所有的邏輯也可以在User對象中封裝的,但如果您使用的是簡單的字典,很難有效地捕捉這些業務規則。

    例如,我可能會建議重構你的User類捕捉到其中的一些業務規則:

    class User { 
        let id: String   // note use of `let`, not `var`, meaning you can't change this 
        var name: String  // note no `?`, meaning that this is required 
        var email: String?  // note use of `?`, meant that this _is_ optional 
        var imageURL: NSURL? // note use of `NSURL`, which more strongly captures/validates a URL string 
    
        init(id: String, name: String, email: String?, imageURL: NSURL?) { 
         self.id = id 
         self.name = name 
         self.email = email 
         self.imageURL = imageURL 
        } 
    } 
    

    現在這是一個不錯的簡單User類型,具有非常有限的代碼,強制執行各種業務邏輯(例如id是必需的,不可變的,需要name但可變的,emailimageURL是可選的和可變的)。顯然,你可以進一步瞭解這個類的定義,封裝各種其他業務需求。

    但是,這樣做的好處是,當在代碼中使用User類時,這些規則會在編譯時執行,消除所有類型的編程問題。這些屬性是強類型的,各種屬性的可變性和可選性很好地封裝在這個簡單的類型中。

底線,有良好設計的模型類型,編寫安全使用和與這些模型類交互的好代碼更容易。

+0

感謝您回答我的問題。我想問問它如何在函數或代碼中使用?任何示例? –

+0

您可以像使用代碼中的任何其他對象一樣使用它。當你想使用它時,你可以實例化它(例如'let user1 = User(42,「Rob」,「[email protected]」,nil)',或者你可以根據需要構建數組(例如'var users = [用戶](); users.append(user1)'等等,沒有什麼特別的地方,只需使用你的模型對象就像你的應用中的任何其他對象一樣。 – Rob

相關問題