假设我有一个包含Posts的User类:
class User {
internal var id: Int
internal var posts: Entities<Post>
}
let myUser = User()
现在,我想获取属于此用户的所有帖子,如下所示:
myUser.posts.fetchAllForUser(myUser.id)
但是,我希望避免将myUser.id
作为fetchAllForUser
中的参数传递。如何在fetchAllForUser
中访问myUser.id
,fetchAllForUser
是由posts
实现的?
编辑:myUser.posts.fetchAllForUser(myUser.id)
的问题是fetchAllForUser
中的self
实际上是posts
。* 我需要类似self.self
的东西,但是self.self
就是self
本身 *,哈哈;- )
此外,泛型类Entities<T>
符合Fetchable
:
class Entities<Element> : Fetchable { ... }
因为有人问我,Fetchable
的预期定义如下:
protocol Fetchable {
associatedtype Element
func fetchAllForUser(onSuccess: () -> [Element], onError: () -> Void) { ... }
}
我并不想把user.id作为参数传递
2条答案
按热度按时间svujldwt1#
您可以简单地创建一个
EntitiesDelegate
协议,其中包含一个包含User
的id
的变量,而不是尝试使用self
访问用户。此解决方案使用可可Touch中的一种常见设计模式,称为委派。然后在
Entities
类中创建一个对EntitiesDelegate
的引用,并修改fetchAllForUser
方法的定义,使id
参数默认为nil。如果传入了id
,则可以使用它,但如果没有,使用委派的id
,而不是使用Nil Coalescing运算子(请注意,这也可能是nil
,所以如果两者都是nil
,可能会掷回错误)然后,只需使
EntitiesDelegate
类符合EntitiesDelegate
协议,就可以在User
类中实现它。就是这样!你现在可以简单地用
myUser.posts.fetchAllForUser()
调用这个方法,因为你已经在User
类中有了一个id
变量,你甚至不需要做任何改变来使它符合EntitiesDelegate
。如果您尝试遵循Swift 3的设计模式,您可能希望将方法签名改为
func fetchAll(for id: Int = nil...)
,当您希望指定id时,可以使用myUser.posts.fetchAll()
或myUser.posts.fetchAll(for: 0)
调用该方法签名。f0brbegy2#
如果我了解您的需求,这是一个可能的解决方案
型号
首先让我们定义您的模型
道
接下来,您需要一个从网络中检索一些数据(例如JSON格式)并将这些数据转换为
Post
的类我建议你用SwiftyJson和Alamofire来实现道
用法
现在你可以写