Ошибка без полезного объяснения в представлении и структуре SwiftUI - PullRequest
0 голосов
/ 10 января 2020

Я пытаюсь составить представление SwiftUI о химии. Я решил создать представление описания, где отображается информация о каждом элементе. Я хочу вызвать функцию для генерации электронной конфигурации, но она выдает ошибку с, по-видимому, никакой полезной информацией. Когда я пытаюсь вызвать функцию в представлении, я получаю эту ошибку:

Error Domain=com.apple.dt.ultraviolet.service Code=12 "Rendering service was interrupted" UserInfo={NSLocalizedDescription=Rendering service was interrupted}

Я попытался переключить способ вызова функций, но ничего не помогло.

Вот код

Элемент объекта:

import Foundation
import Combine

struct Element: Decodable, Identifiable, Hashable {
    public var id: Int
    public var name: String
    public var symbol: String
    public var atomicMass: Double
    public var atomicRadius: Double
    public var density: Double
    public var eConfig: [Int]

    /*
     -- electron config layout
     [2, 2, 6, ...] -> 1s2 2s2 2p6 ...
     */

    func createOrbital() -> String {
        var orbital: String = ""

        // MARK: Orbital Loop
        for (index, val) in self.eConfig.enumerated() {
            let block = orbitalBlock(from: index)!
            var level = getRow(from: index)!

            // MARK: Subtraction rules
            if block == "d" {
                level -= 1
            } else if block == "f" {
                level -= 2
            }

            orbital += String(level)
            orbital += String(block)
            orbital += superscript(from: val)
        }

        return orbital
    }
}

func superscript(from val: Int) -> String {
    let str = String(val)
    let supers = [
        "0": "\u{2070}",
        "1": "\u{00B9}",
        "2": "\u{00B2}",
        "3": "\u{00B3}",
        "4": "\u{2074}",
        "5": "\u{2075}",
        "6": "\u{2076}",
        "7": "\u{2077}",
        "8": "\u{2078}",
        "9": "\u{2079}"]

    var newStr = ""
    for char in str {
        let key = String(char)
        newStr.append(Character(supers[key]!))
    }
    return newStr
}

func orbitalBlock(from index: Int) -> String? {
    switch (index) {
    case 1...4, 11, 12, 19, 20, 37, 38, 55, 56, 87, 88:
        return "s"
    case 5...10, 13...18, 31...36, 49...54, 81...86, 113...118:
        return "p"
    case 21...30, 39...48, 72...80, 104...112:
        return "d"
    case 57...71, 89...103:
        return "f"
    default:
        return nil
    }
}

func getRow(from index: Int) -> Int? {
    switch (index) {
    case 1...2:
        return 1
    case 3...10:
        return 2
    case 11...18:
        return 3
    case 19...36:
        return 4
    case 37...54:
        return 5
    case 55...86:
        return 6
    case 87...118:
        return 7
    default:
        return nil
    }
}

Вид элемента:

import SwiftUI


struct ElementDetailView: View {
    public var element: Element
    private var orbital: String

    init(element: Element) {
        self.element = element
        self.orbital = element.createOrbital()
    }

    var body: some View {
        VStack {
            Text(orbital)
        }
    }
}



struct ElementDetailView_Previews: PreviewProvider {
    static var previews: some View {
        ElementDetailView(element: Element(id: 1, name: "Hydrogen", symbol: "H", atomicMass: 2.0, atomicRadius: 2.0, density: 2.0, eConfig: [1]))
    }
}

Ответы [ 2 ]

1 голос

Просто запустите ваше приложение, и вы увидите сбои из-за принудительного развертывания nil в строках кода:

let block = orbitalBlock(from: index)!
var level = getRow(from: index)!

enter image description here

0 голосов
/ 10 января 2020

Правильный порядок для должен быть:

     for ( val, index) in self.eConfig.enumerated() {...}

Оригинальный неверный:

     for (index, val) in self.eConfig.enumerated() {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...