在Swift中实现特定方法调用的闭包

时间:2014-06-17 06:19:42

标签: ios uitableview swift

我遇到了以下UITableViewController代码,并希望实现与之相关的classes和函数,以便我更多地了解Swift。

我不确定api.getRooms()的实现是什么样的。我认为这可能是一个关闭,但我不完全确定?

我的问题是考虑到api.getRooms()用法会{}返回什么?如果有人能向我解释发生了什么,那将非常感激。

api.getRooms(User.currentUser()!) { (roomsObj, error) in
    if let rooms = roomsObj as? Array<Room> {
        self.rooms = rooms
        self.tableView.reloadData()
        if (viaPullToRefresh) {
            self.refreshControl.endRefreshing()
        }
    }
}

PullViewController.swift

class PullViewController: UITableViewController {
    var rooms = Array<Room>()

    init(coder aDecoder: NSCoder!) {
        super.init(coder: aDecoder)

        // Custom initialization
        assert(User.currentUser())
    }

    override func viewDidLoad() {
        self.refreshControl = UIRefreshControl()
        self.refreshControl.addTarget(self, action: Selector("refreshInvoked"), forControlEvents: UIControlEvents.ValueChanged)
        refresh()
    }

    override func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int {
        return rooms.count
    }

    override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath:NSIndexPath!) -> UITableViewCell! {
        var cell: UITableViewCell? = tableView.dequeueReusableCellWithIdentifier("Cell") as? UITableViewCell
        if !cell {
            cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier:"Cell")
        }

        let room = rooms[indexPath.row]
        cell!.textLabel.textColor = UIColor.blackColor()
        cell!.textLabel.text = "\(room.name)(\(room.messageCount))"
        return cell
    }

    func refreshInvoked() {
        refresh(viaPullToRefresh: true)
    }

    func refresh(viaPullToRefresh: Bool = false) {
        let api = API()
        api.getRooms(User.currentUser()!) { (roomsObj, error) in
            if let rooms = roomsObj as? Array<Room> {
                self.rooms = rooms
                self.tableView.reloadData()
                if (viaPullToRefresh) {
                    self.refreshControl.endRefreshing()
                }
            }
        }
    }
}

User.swift

class User {

    init() {
    }

    class func currentUser() -> Bool {
        return true
    }
}

Room.swift

class Room {

    var name: String
    var messageCount: Int

    init() {
    }
}

API.swift (不确定这是否已正确实施)。

class API {

    init() {
    }

    func getRooms(user: User) -> (Array<Room>, String) { // ??
        // ??
    }
}

3 个答案:

答案 0 :(得分:1)

1)由于你的currentUser方法没有返回任何东西,你发送的断言是空的,所以断言不知道这是好还是坏。因此,如果你想像这样使用它,你需要让currentUser返回一个BOOL或其他东西,但它需要某种BOOL结果来判断它是否正确断言。希望这是有道理的。

2)您试图为getRooms函数提供lambda函数,而不是在结果后运行函数。

- Update-- 如果你想要一个完成lambda然后你想写这样的getRooms:

func getRooms(user: User, completion: ((Array<Room>,String?) -> Void)?) -> Array<Room> {//String because I have no idea what type they want for errors
    var room = Room()

    room.messageCount = 0
    room.name = "Room1"

    var rooms = Array<Room>()
    rooms.append(room)

    completion?(rooms,nil)

    return rooms
}

或沿着这些方向的东西

答案 1 :(得分:1)

在你的房间类中,你没有初始化名称和消息计数变量,在swift中只有可选变量可以是nil

class Room {

    var name: String
    var messageCount: Int

    init(name:String, messageCount:Int) {
        self.name = name
        self.messageCount = messageCount
    }
}

还断言需要评估bool所以

assert(User.currentUser() != nil)

答案 2 :(得分:0)

这是我实现api.getRooms()功能的方式:

<强> API.swift

class API {

    func getRooms(user: User, completion: (Array<Room>, String) -> ()) {
        var room = Room(name: "Room1", messageCount: 0)

        var rooms = Array<Room>()
        rooms.append(room)

        completion(rooms, "error")
    }

}

<强> PullViewController.swift

func refresh(viaPullToRefresh: Bool = false) {

    let api = API()

    if let user = User.currentUser() {
        api.getRooms(user) { (roomsObj, error) in
            self.rooms = roomsObj
            self.tableView.reloadData()
            if (viaPullToRefresh) {
                self.refreshControl.endRefreshing()
            }
        }
    }

}