我想重构我的代码以应用干净的方法。
我有一个班级user
class User {
let name: String?
let id: String
var isOnline: Bool
var mesaageHistory = [Message]()
init(name: String, id: String, isOnlineStatus: Bool) {
self.name = name
self.id = id
self.isOnline = isOnlineStatus
}
}
然后我使用Fabric模式创建我的用户列表。
protocol CreateUserProtocol: class {
func sortArray(inputArr: [User])
}
class CreateUserEntity: CreateUserProtocol {
static let shared = CreateUserEntity()
var users = [User]()
func sortArray(inputArr: [User]){
var applySortingByDate: Bool = false
for user in inputArr {
if !user.mesaageHistory.isEmpty {
applySortingByDate = true
}
}
if applySortingByDate {
inputArr.sorted(by: { (first, second) -> Bool in
(first.mesaageHistory.last?.messageTime)! < (second.mesaageHistory.last?.messageTime)!
})
} else {
inputArr.sorted(by: { (first, second) -> Bool in
first.name! < second.name!
})
}
}
}
一个控制器负责追加新用户,而另一个控制器用于检索它们并将它们绑定到tableView。一切都运行正常,但我认为我的解决方案不足以扩展。
此外,在我的一个VC中,我用来对用户进行在线和离线排序。我想,我不应该在我的VC中这样做并将这个逻辑放入我的CreateUserEntity
var onlineUsersData = [User]()
var offlineUsersData = [User]()
private func classifyUsers() {
for user in CreateUserEntity.shared.users {
print("is user online: \(user.isOnline)")
print(CreateUserEntity.shared.users.count)
if user.isOnline == true && !onlineUsersData.contains(user) {
onlineUsersData.append(user)
}
if user.isOnline == false && !offlineUsersData.contains(user) {
offlineUsersData.append(user)
}
}
}
我想以适当的方式重写它,你能推荐我什么?
答案 0 :(得分:0)
从我的观点来看,首先尝试使用struct
而不是class
。
示例:
struct User {
let name: String
}
然后你应该弄清楚你将存储这些用户的位置?现在他们在记忆中。所以我们应该定义存储它们的位置和方式。
因此,对于这种情况,我们可以将NSUserDefaults
视为存储用户的类的核心。之后我们应该为此类创建外观来管理我们的用户。
protocol UserStoreFacade {
func fetch(name withName:String) -> User
func create(name withName:String) -> User
func save(user:User)
func update(name newName:String) -> User
func delete(name withName:String)
}
用于管理用户的UserStore
。
class UserStore: UserStoreFacade {
let defaults = UserDefaults(suiteName: "User")
func fetch(name withName:String) -> User {
let encodeData = defaults?.dictionary(forKey: withName)
return User(dictionary: encodeData as! Dictionary<String, AnyObject>)
}
func create(name withName: String) -> User {
return User(name: withName)
}
func save(user: User) {
defaults?.set(user.encode(), forKey: user.name)
}
func update(name newName:String) -> User {
return User(name: newName)
}
func delete(name withName:String) {
defaults?.removeObject(forKey: withName)
}
}
这是非常原始的,但仍然显示了如何才能实现。