调用函数在Init

时间:2018-03-08 16:54:29

标签: ios swift uitableview swift4

我试图像Facebook一样创建个人资料,并且传递的联系人变量和contactInfo变量分别具有userID和电话号码,电子邮件和地址列表。 为了在表格视图的各自部分显示电话号码,电子邮件和地址,我认为最简单的方法是将ContactInfo转换为三个独立的数组:contactInfoPhoneList,contactInfoEmailList,contactInfoAddressList

如果我没有初始化self.contactInfoPhoneList以及super.init上方的其他两个,我会收到错误,但我似乎无法在超级之前调用contactInfoToList函数。 init,否则我会在super.init之前在方法调用中调用self。

但是,如果我尝试在超级初始化之后初始化它们,那么我就是一个"不可变的值' self.contactInfoPhoneList'可能只会初始化一次"错误。

这是如何从init创建另外三个数组的,还是应该以不同的方式完成?任何帮助解决错误的人都将不胜感激!

class ViewController: UIViewController {

    let contact: ContactStruct
    let contactInfo: [ContactInfo]
    let contactInfoPhoneList: [ContactInfo]
    let contactInfoEmailList: [ContactInfo]
    let contactInfoAddressList: [ContactInfo]


    init(contact: ContactStruct, contactInfo: [ContactInfo]) {

        self.contact = contact
        self.contactInfo = contactInfo

        super.init(nibName: nil, bundle: nil)

        let contactInfoList = self.contactInfoToList(contactInfoList: contactInfo)

        self.contactInfoPhoneList = contactInfoList[0]
        self.contactInfoEmailList = contactInfoList[1]
        self.contactInfoAddressList = contactInfoList[2]


    }
}

extension ViewController {

    func contactInfoToList(contactInfoList: [ContactInfo]) -> [[ContactInfo]] {
        var phoneList = [ContactInfo]()
        var emailList = [ContactInfo]()
        var addressList = [ContactInfo]()

        for info in contactInfoList {
            switch info.contactInfoType {
            case .Phone:
                phoneList.append(info)
            case .Email:
                emailList.append(info)
            case .Address:
                addressList.append(info)
            }
        }
        return [phoneList, emailList, addressList]
    }
}

1 个答案:

答案 0 :(得分:1)

两个选项:

  • 省略扩展名并将代码放入init方法

    init(contact: ContactStruct, contactInfo: [ContactInfo]) {
    
        self.contact = contact
        self.contactInfo = contactInfo
    
        var phoneList = [ContactInfo]()
        var emailList = [ContactInfo]()
        var addressList = [ContactInfo]()
    
        for info in contactInfo {
            switch info.contactInfoType {
            case .Phone:
                phoneList.append(info)
            case .Email:
                emailList.append(info)
            case .Address:
                addressList.append(info)
            }
        }
        self.contactInfoPhoneList = phoneList
        self.contactInfoEmailList = emailList
        self.contactInfoAddressList = addressList
    
        super.init(nibName: nil, bundle: nil)
    }
    
  • 使用初始化程序声明编译器抱怨的var常量

    var contactInfoPhoneList = [ContactInfo]()
    var contactInfoEmailList = [ContactInfo]()
    var contactInfoAddressList = [ContactInfo]()