Правильный способ инициализации класса модели данными, собранными из системы (macOS) - PullRequest
0 голосов
/ 18 марта 2019

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

я хочу иметь возможность:

let sysInfoModel = SysInfoModel()

let installedOsVersion = sysInfoModel.osVersion

Класс модели должен быть создан из vieController, которому нужна эта информацияустановить.Я думаю, что вся моя попытка неверна, чтобы достичь такой цели.Как правильно это сделать?

class SysInfoModel {

    // Properties
    let macModel: String?
    let osVersion: String?

    // Initialization
    init() {
        if let actualModel = getMacModel() { //ERROR: 'self' used in method call 'getMacModel' before all stored properties are initialized
            self.macModel = actualModel
        } else {
            macModel = "Hardware model not found"
        }

        if let actualOsVersion = getOsVersion() { // ERROR: 'self' used in method call 'getOsVersion' before all stored properties are initialized
            osVersion = actualOsVersion
        } else {
            osVersion = "OS Version not available"
        }
    }


    // Returns the hardware model identifier as a string
    func getMacModel()  -> String? {

        var modelIdentifier: String?

        let service = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("IOPlatformExpertDevice"))
        if let modelData = IORegistryEntryCreateCFProperty(service, "model" as CFString, kCFAllocatorDefault, 0).takeRetainedValue() as? Data {
            modelIdentifier = String(data: modelData, encoding: .utf8)
        }

        IOObjectRelease(service)
        return modelIdentifier
    }

    // Returns the OS Version as a String
    func getOsVersion() -> String? {

        let osVersion: OperatingSystemVersion = ProcessInfo.processInfo.operatingSystemVersion
        let osVersionString = String("\(osVersion.majorVersion).\(osVersion.minorVersion).\(osVersion.patchVersion)")

        return osVersionString
    }
}

Обновление после ответа Мэтта:

// Properties
var askSystem: AskTheSystem
let macModel: String?
let osVersion: String?

init() {

    askSystem = AskTheSystem()

    if let actualModel = askSystem.getMacModel() {
        self.macModel = actualModel
    } else {
        macModel = "Hardware model not found"
    }

    if let actualOsVersion = askSystem.getOsVersion() {
        osVersion = actualOsVersion
    } else {
        osVersion = "OS Version not available"
    }
}

Я так и сделал, есть возможность поставить функции getMacModel() & getOsVersion()в отдельном классе под названием AskTheSystem.Создайте его в SysInfoModel.Это работает, но это хорошая практика?я не вижу смысла в добавлении другого класса только для этих функций?Как правильно это сделать?

1 Ответ

0 голосов
/ 18 марта 2019

Я согласен с Мэттом, правильное суждение .

Разумным решением являются ленивые экземпляры свойств, оба значения извлекаются один раз при обращении к свойству.первый раз

class SysInfoModel {

    // Returns the hardware model identifier as a string
    lazy var macModel : String = {
        let service = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("IOPlatformExpertDevice"))
        defer{IOObjectRelease(service)}
        guard let modelData = IORegistryEntryCreateCFProperty(service, "model" as CFString, kCFAllocatorDefault, 0).takeRetainedValue() as? Data else {
            return "Hardware model not found"
        }
        return String(data: modelData, encoding: .utf8)!
    }()

    // Returns the OS Version as a String
    lazy var osVersion : String = {
        let osVersion = ProcessInfo.processInfo.operatingSystemVersion
        return "\(osVersion.majorVersion).\(osVersion.minorVersion).\(osVersion.patchVersion)"
    }()

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...