Ios Swift-访问self以避免将参数传递给函数

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)的问

假设我有一个带有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)
的问题是
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
  }
}