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

kpbwa7wx  于 2022-11-06  发布在  Swift
关注(0)|答案(2)|浏览(174)

假设我有一个包含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.idfetchAllForUser是由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作为参数传递

svujldwt

svujldwt1#

您可以简单地创建一个EntitiesDelegate协议,其中包含一个包含Userid的变量,而不是尝试使用self访问用户。此解决方案使用可可Touch中的一种常见设计模式,称为委派。

protocol EntitiesDelegate {
  var id: String {get set}
}

然后在Entities类中创建一个对EntitiesDelegate的引用,并修改fetchAllForUser方法的定义,使id参数默认为nil。如果传入了id,则可以使用它,但如果没有,使用委派的id,而不是使用Nil Coalescing运算子(请注意,这也可能是nil,所以如果两者都是nil,可能会掷回错误)

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
  }
}

然后,只需使EntitiesDelegate类符合EntitiesDelegate协议,就可以在User类中实现它。

class User: EntitiesDelegate {
  ...
  init(...) {
    ...
    posts.delegate = self
  }
}

就是这样!你现在可以简单地用myUser.posts.fetchAllForUser()调用这个方法,因为你已经在User类中有了一个id变量,你甚至不需要做任何改变来使它符合EntitiesDelegate
如果您尝试遵循Swift 3的设计模式,您可能希望将方法签名改为func fetchAll(for id: Int = nil...),当您希望指定id时,可以使用myUser.posts.fetchAll()myUser.posts.fetchAll(for: 0)调用该方法签名。

f0brbegy

f0brbegy2#

如果我了解您的需求,这是一个可能的解决方案

型号

首先让我们定义您的模型

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.sharedInstance.fetchUser("1") { (user) in
    if let user = user {
        print(user.posts)
    }
}

相关问题