编译应用程序时Macbook崩溃

时间:2017-10-23 15:12:22

标签: swift xcode

在编译我的项目时,编译器卡在这个类上,在尝试构建大约5分钟后,我收到一条消息,告诉我我已经没有系统内存并关闭一些应用程序以继续。这段代码中是否有可能导致编译器崩溃的内容?

我正在使用XCode9,因为我的整台计算机都崩溃了,这可能是XCode的错误吗?

import UIKit

class ConferenceNumberViewController: UITableViewController, UINavigationControllerDelegate {

    let sections = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"]
    let countries = CallIn.Data.allCountries
    var indexedCountries =
    [
        "A": [String](),
        "B": [String](),
        "C": [String](),
        "D": [String](),
        "E": [String](),
        "F": [String](),
        "G": [String](),
        "H": [String](),
        "I": [String](),
        "J": [String](),
        "K": [String](),
        "L": [String](),
        "M": [String](),
        "N": [String](),
        "O": [String](),
        "P": [String](),
        "Q": [String](),
        "R": [String](),
        "S": [String](),
        "T": [String](),
        "U": [String](),
        "V": [String](),
        "W": [String](),
        "X": [String](),
        "Y": [String](),
        "Z": [String]()
    ]
    var countryNumberIndex: Int = 0
    var indexedConferenceNumbers = CallIn.Data.indexedConferenceNumbers
    var selectedConferenceNumber: CallIn.ConferenceNumber!

    override func viewDidLoad() {
        super.viewDidLoad()

        countryAndConference = true
        // Do any additional setup after loading the view.

        //hide back button according to design
        navigationItem.setHidesBackButton(true, animated: false)

        for section in sections {
            for country in countries {
                let searchCharacter: Character = section.characters.first!
                let countryCheck: Character = country.characters.first!
                let compare = countryCheck == searchCharacter
                if compare {
                    indexedCountries[section]!.append(country)
                }
            }
        }

//        indexedConferenceNumbers = indexedConferenceNumbers.sort(sortFunc) // moved the sorting to the Data class

    }

    /*func sortFunc(num1: CallIn.ConferenceNumber, num2: CallIn.ConferenceNumber) -> Bool {
        return num1.country == num2.country ? (num1.typeOfNumber > num2.typeOfNumber) : (num1.country < num2.country)
    }*/ // moved the sorting to the Data class

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    // custom section view
    override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
        let header: UITableViewHeaderFooterView = view as! UITableViewHeaderFooterView //recast your view as a UITableViewHeaderFooterView
        header.contentView.backgroundColor = Design.Colours.lightBlue      // make the background light grey
        if (accessibilityON){
            header.textLabel!.font = UIFont(descriptor: UIFontDescriptor.regularDescriptor(UIFontTextStyle.body.rawValue), size: 0)
        } else { header.textLabel!.font = UIFont.systemFont(ofSize: 13)}
        //  header.textLabel!.textColor = Design.Colours.subtextDarkGrey    //make the text dark grey
        // header.textLabel!.font = UIFont.systemFontOfSize(13)            // set size of text
        //header.alpha = 0.5 //make the header transparent
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "CountryCell", for: indexPath)
        let country = cell.viewWithTag(511) as! UILabel
        let number = cell.viewWithTag(512) as! UILabel
        let type = cell.viewWithTag(513) as! UILabel

        // we have to calculate the index (jump) because the conference numbers list is single array (there are no sections)
        var jump = 0
        for index in 0...(indexPath as NSIndexPath).section {
            (index == (indexPath as NSIndexPath).section) ? (jump = jump + (indexPath as NSIndexPath).row) : (jump = jump + indexedCountries[sections[index]]!.count)
        }

        country.text = indexedConferenceNumbers[jump].country
        number.text = indexedConferenceNumbers[jump].conferenceNumber
        type.text = indexedConferenceNumbers[jump].typeOfNumber
        return cell
    }

    override func numberOfSections(in tableView: UITableView) -> Int {
        return sections.count
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return indexedCountries[sections[section]]!.count
    }

    override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        if (countriesPerSection("\(sections[section])").count == 0) {
            return nil
        }
        return sections[section] as String
    }

    //index on the right side of the screen
    override func sectionIndexTitles(for tableView: UITableView) -> ([String]!){
        return self.sections
    }



    override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        if (countriesPerSection("\(sections[section])").count == 0) {
            return 0.1
        }
        return 30.0
    }


    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let indexPath = self.tableView.indexPathForSelectedRow {
            tableView.deselectRow(at: indexPath, animated: true)
            let selectedCell = tableView.cellForRow(at: indexPath) as UITableViewCell!
            let country = selectedCell?.contentView.viewWithTag(511) as! UILabel
            let number = selectedCell?.contentView.viewWithTag(512) as! UILabel
            let type = selectedCell?.contentView.viewWithTag(513) as! UILabel
            // Set the number to be passed to SettingDetailsViewController after the unwind segue.
            selectedConferenceNumber = CallIn.ConferenceNumber(country: country.text!, conferenceNumber: number.text!, typeOfNumber: type.text!, isoCode: "")
        }
    }

    private func countriesPerSection(_ section: String) -> [String] {
        var matches = [String]()
        for country in indexedCountries["\(section)"]! {
            matches.append(country)
        }

        return matches
    }

    private func conferenceNumbersPerCountry(_ country: String) -> Array<CallIn.ConferenceNumber> {
        var matches = Array<CallIn.ConferenceNumber>()
        for numbers in indexedConferenceNumbers {
            if numbers.country == country {
                let conferenceNumber = CallIn.ConferenceNumber(country: numbers.country, conferenceNumber: numbers.conferenceNumber, typeOfNumber: numbers.typeOfNumber, isoCode: numbers.isoCode)
                matches.append(conferenceNumber)
            }
        }
        return matches
    }

    @IBAction private func goBack(_ sender: UIBarButtonItem) {
        self.navigationController!.popViewController(animated: true)
    }
}

2 个答案:

答案 0 :(得分:3)

Swift编译器可能遇到如此大的字典问题,并尝试推断indexedCountries变量的正确类型。

一种解决方案是提供类型:

var indexedCountries: [String, [String]] =

更好的解决方案是避免使用此类代码。将硬编码字典更改为以下内容:

var indexedCountries = [String, [String]]()

然后在viewDidLoad中你可以填充它:

for letter in sections {
    indexedCountries[letter] = [String]()
}

这可以避免大量的额外输入,避免潜在的拼写错误,并使编译器的工作变得非常简单(编译速度更快)。

您也可以将sections的声明更新为:

let sections: [String] = [ "A", ... ]

答案 1 :(得分:0)

降级到XCode 8.3.3为我解决了这个问题。如果我找到一个可以让9.0或9.1工作的话,我会编辑这个答案。