如何在if / switch语句中声明一个变为全局的变量?

时间:2017-09-12 23:29:49

标签: ios swift uitableview swift3

我正在尝试使用多个自定义UITableViewCell,而不必为每个选项复制cellForRowAt方法中的所有代码

我正在创建一个实时聊天应用程序,用于学习目的,根据消息发送者是用户的天气来区分小区类。我知道如何使用if-else或switch语句给cellForRowAt相关的ReusableCell,但问题是:

  1. 处理单元格属性的200行代码没有 可以访问单元格变量,除非我将它们定义为外部 switch / if语句。
  2. 当我在函数的标题中定义它时,它需要预定义类型
  3. 如果我选择任一类型作为默认类型并声明它我会得到错误的不兼容,实际上它们从代码的角度来看是100%相同的(只有设计不同)
  4. 如果我声明它是一个通用的UITableViewCell类型,那么该类型缺少我的所有自定义属性。
  5. 如果我尝试创建一个公共基类,我无法链接我的 @IBOutlets和@IBActions,这是共同点的主要部分。 如果我尝试构建协议,协议不支持任何内容 @IB。
  6. 如果我可以在if / switch语句中声明单元格变量并使其对我的其余代码可见而不必将其嵌套在if / switch中,则可以解决此问题。有没有办法做到这一点?

    PS。我知道我可以通过为自定义tableview单元格的每个变体复制200行代码来克服这个问题,但我的直觉告诉我必须有更聪明的方法来做到这一点。

    以下是说明问题的代码段:

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
    
        // Get the info about the message from an array
        let message = messageArray[indexPath.row]
    
        // Pick cell style based on who the sender is
        var isUsersPost = 0
        if message.sender == userID {
            isUsersPost = 1
        }
    
        switch isUsersPost {
        case 1:
            let cell = chatTableView.dequeueReusableCell(withIdentifier: "rightChatCell") as! RightChatViewCell
        case 0:
            let cell = chatTableView.dequeueReusableCell(withIdentifier: "chatCell") as! ChatViewCell
        default:
            let cell = chatTableView.dequeueReusableCell(withIdentifier: "chatCell") as! ChatViewCell
        }
    
        // fill in the cell properties with data - ca 200 lines of logic that is already optimised as much as reasonable
        cell.messageTextLabel = message.text 
        ... etc
    
        return cell   
        }
    

    这是我的TableViewCell类(它们是相同的):

     import UIKit
    
     class RightChatViewCell: UITableViewCell {
    
    var likeTask : (() -> Void)? = nil
    var commentTask : (() -> Void)? = nil
    var photoTask : (() -> Void)? = nil
    
    
    @IBOutlet weak var messageBoxView: UIView!
    @IBOutlet weak var messageTextLabel: UILabel!
    @IBOutlet weak var nicknameLabel: UILabel!
    @IBOutlet weak var profilePhotoView: UIImageView!
    @IBOutlet weak var messageDateLabel: UILabel!
    @IBOutlet weak var messageCommentLabel: UILabel!
    
    @IBOutlet weak var likeButton: UIButton!
    @IBOutlet weak var messageLikesLabel: UILabel!
    @IBOutlet weak var messagePhotoView: UIImageView!
    
    override func awakeFromNib() {
        super.awakeFromNib()
        messagePhotoView.isHidden = true
        self.selectionStyle = UITableViewCellSelectionStyle.none
        // Add photo Tap gesture recognizer
        messagePhotoView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(photoTapped)))
    }
    
    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    
        // Configure the view for the selected state
    }
    
    @objc func photoTapped() {
        print("Photo tapped")
        if let btnAction = self.photoTask
        {
            btnAction()
        }
    }
    
    @IBAction func likeTapped(_ sender: Any) {
        print("Like tapped")
        if let btnAction = self.likeTask
        {
            btnAction()
        }
    }
    
    @IBAction func commentTapped(_ sender: Any) {
        print("Comment tapped")
        if let btnAction = self.commentTask
        {
            btnAction()
        }
    }
    
    }
    

1 个答案:

答案 0 :(得分:-2)

如果您将类级别的变量声明为null,则为0或''然后在try和catch中实例化它们,尽管您可能需要在类上包含异常处理程序,因为如果实例化不成功,您将需要处理该问题。

查看有关范围和变量的链接 https://www.cs.umd.edu/~clin/MoreJava/Objects/local.html