Ios Swift-访问self以避免将参数传递给函数
假设我有一个带有Posts的用户类:Ios Swift-访问self以避免将参数传递给函数,ios,swift,swift2,Ios,Swift,Swift2,假设我有一个带有Posts的用户类: class User { internal var id: Int internal var posts: Entities<Post> } let myUser = User() 但是,我希望避免将myUser.id作为fetchAllForUser中的参数传递。如何在fetchAllForUser中访问myUser.id,这是由posts实现的 编辑: myUser.posts.fetchAllForUser(myUser.id)的问
class User {
internal var id: Int
internal var posts: Entities<Post>
}
let myUser = User()
但是,我希望避免将myUser.id
作为fetchAllForUser
中的参数传递。如何在fetchAllForUser
中访问myUser.id
,这是由posts
实现的
编辑:
myUser.posts.fetchAllForUser(myUser.id)
的问题是fetchAllForUser
中的self
实际上是posts
。我需要类似于self.self
的东西,但是self.self
是self
本身,lol;-)
此外,泛型类实体
符合可获取
:
class Entities<Element> : Fetchable { ... }
看,我真的不想将user.id作为参数传递,如果我了解您需要什么,这是一个可能的解决方案 模型 首先,让我们定义您的模型
struct Post {
let userID: String
}
struct User {
let id: String
let posts: [Post]
init(id: String, posts:[Post]) {
self.id = id
self.posts = posts
}
}
刀
接下来,您需要一个类从网络中检索一些数据(例如JSON格式),并将这些数据转换为Post
final class Dao {
static let sharedInstance = Dao()
private init() { }
func fetchUser(id:String, completion: (user: User?) -> ()) {
// call webservice
// convert NSData to JSON
// extract id and posts from JSON
// create User value
// if everything goes fine then call completion(user)
// else call comletion(nil)
}
}
我建议您使用SwiftyJson和Alamofire来实现Dao
用法
现在你可以写作了
Dao.sharedInstance.fetchUser("1") { (user) in
if let user = user {
print(user.posts)
}
}
您不必尝试使用
self
访问用户,只需创建一个EntitiesDelegate
协议,该协议包含一个包含用户id
的变量。此解决方案使用Cocoa Touch中称为委派的通用设计模式
protocol EntitiesDelegate {
var id: String {get set}
}
然后在实体
类中创建对实体委托
的引用,并将fetchAllForUser
方法的定义更改为默认情况下将id
参数设置为nil。如果传入了id
,您可以使用它,但如果没有传入,则使用代理的id
,而不是使用Nil合并运算符(请注意,这也可能是Nil
,因此如果两者都是Nil
,则可能会抛出错误)
就这样!现在,您可以使用myUser.posts.fetchAllForUser()
简单地调用该方法,并且由于您的User
类中已经有一个id
变量,因此您甚至不需要更改任何内容以使其符合EntitiesDelegate
如果您试图遵循Swift 3设计模式,您可能希望将方法签名改为func fetchAll(对于id:Int=nil…
,可以使用myUser.posts.fetchAll()
或myUser.posts.fetchAll(对于:0)
来调用该签名。是否可以提供更多上下文?什么是元素
?id
和posts
let
常量还是var
s更好?我已更正了通用id和指定id&POST。剩下的,你可以认为是黑盒精确的实现并不重要。<代码>可获取的< /COD>定义了什么?@ AppZyLyLe是否回答了你的问题?但是这不是一个有效的语法<代码> var帖子:实体:可获取的< /代码>这是完美的,谢谢!你也可以建议重新命名这个问题,因为这个答案非常好,如果有更多的人看到它,那就更好了it@lustoykov不客气!查看Swift中有关面向协议编程的更多信息。我对您的答案投了赞成票,但请参阅@kabiroberai-这就是我的问题的答案:)
Dao.sharedInstance.fetchUser("1") { (user) in
if let user = user {
print(user.posts)
}
}
protocol EntitiesDelegate {
var id: String {get set}
}
class Entities<Element> : Fetchable {
var delegate: EntitiesDelegate?
func fetchAllForUser(id: Int = nil, onSuccess: () -> [Element], onError: () -> Void) {
guard let idToUse = id ?? delegate?.id else {
return //Maybe throw an error here
}
//Use idToUse from here on
}
}
class User: EntitiesDelegate {
...
init(...) {
...
posts.delegate = self
}
}