首页 > 解决方案 > 另一个计算变量设置器中的计算变量设置器使应用程序崩溃

问题描述

此代码导致稍后在 EXC_BAD_ACCESS 某处崩溃

SomeLoader().selectedIndex = 1    

class SomeLoader {

        // MARK: - Public

        var selectedIndex: Int? {
            get {
                return dataStorage.selectedIndex
            }
            set {
                dataStorage.selectedIndex = newValue
            }
        }
    }

这段代码没有崩溃:

SomeLoader().selectedIndex = 1    

    class SomeLoader {

            // MARK: - Public

            var selectedIndex: Int? {
                get {
                    return dataStorage.selectedIndex
                }
                set {
                    dataStorage.updateSelected(index: newValue)
                }
            }
        }

在哪里:

struct DataStorage<T: Hashable> {
    enum Keys: String {
        case selectedIndex
    }
    private func get<U>(forKey key: String) -> U? {
        guard let objectData = getData(forKey: key) else {
            return nil
        }
        let object: U? = get(forData: objectData)
        return object
    }
    private func get<U>(forData objectData: Data) -> U? {
        return NSKeyedUnarchiver.unarchiveObject(with: objectData) as? U
    }
    private func save<U>(forKey key: String, object: U) {
        let encodedData = NSKeyedArchiver.archivedData(withRootObject: object)
        UserDefaults.standard.set(encodedData, forKey: key)
    }
}
extension DataStorage {
    func updateSelected(index: Int?) {
        guard let index = index else {
            remove(forKey: Keys.selectedIndex.rawValue)
            return
        }
        saveSelected(index: index)
    }
    var selectedIndex: Int? {

        get {
            return get(forKey: Keys.selectedIndex.rawValue)
        }
        set {
            guard let index = newValue else {
                remove(forKey: Keys.selectedIndex.rawValue)
                return
            }
            saveSelected(index: index)
        }
    }
 }

为什么?它是一个错误吗?

带有错误和调用堆栈的屏幕截图。该错误稍后出现在代码的另一部分中。

在此处输入图像描述

在此处输入图像描述

下面的代码在 iOS 中崩溃。但在操场上工作。

//: Playground - noun: a place where people can play

import UIKit

struct DataStorage<T: Hashable> {
    enum Keys: String {
        case selectedIndex
    }
    private func get<U>(forKey key: String) -> U? {
        guard let objectData = getData(forKey: key) else {
            return nil
        }
        let object: U? = get(forData: objectData)
        return object
    }
    private func get<U>(forData objectData: Data) -> U? {
        return NSKeyedUnarchiver.unarchiveObject(with: objectData) as? U
    }
    private func save<U>(forKey key: String, object: U) {
        let encodedData = NSKeyedArchiver.archivedData(withRootObject: object)
        UserDefaults.standard.set(encodedData, forKey: key)
    }
    private func remove(forKey key: String) {
        UserDefaults.standard.removeObject(forKey: key)
    }
    private func saveSelected(index: Int) {
        save(forKey: Keys.selectedIndex.rawValue, object: index)
    }
    private func getData(forKey key: String) -> Data? {
        return getContent(forKey: key) as? Data
    }
    private func getContent(forKey key: String) -> Any? {
        return UserDefaults.standard.value(forKey: key)
    }
}
extension DataStorage {
    func updateSelected(index: Int?) {
        guard let index = index else {
            remove(forKey: Keys.selectedIndex.rawValue)
            return
        }
        saveSelected(index: index)
    }
    var selectedIndex: Int? {

        get {
            return get(forKey: Keys.selectedIndex.rawValue)
        }
        set {
            guard let index = newValue else {
                remove(forKey: Keys.selectedIndex.rawValue)
                return
            }
            saveSelected(index: index)
        }
    }
}

class SomeLoader {

    // MARK: - Public
    var dataStorage = DataStorage<Int>()
    var selectedIndex: Int? {
        get {
            return dataStorage.selectedIndex
        }
        set {
            dataStorage.selectedIndex = newValue
        }
    }
}

let someLoader = SomeLoader()
someLoader.selectedIndex = 1
print(someLoader)

下面的代码适用于任何地方

//: Playground - noun: a place where people can play

import UIKit

struct DataStorage<T: Hashable> {
    enum Keys: String {
        case selectedIndex
    }
    private func get<U>(forKey key: String) -> U? {
        guard let objectData = getData(forKey: key) else {
            return nil
        }
        let object: U? = get(forData: objectData)
        return object
    }
    private func get<U>(forData objectData: Data) -> U? {
        return NSKeyedUnarchiver.unarchiveObject(with: objectData) as? U
    }
    private func save<U>(forKey key: String, object: U) {
        let encodedData = NSKeyedArchiver.archivedData(withRootObject: object)
        UserDefaults.standard.set(encodedData, forKey: key)
    }
    private func remove(forKey key: String) {
        UserDefaults.standard.removeObject(forKey: key)
    }
    private func saveSelected(index: Int) {
        save(forKey: Keys.selectedIndex.rawValue, object: index)
    }
    private func getData(forKey key: String) -> Data? {
        return getContent(forKey: key) as? Data
    }
    private func getContent(forKey key: String) -> Any? {
        return UserDefaults.standard.value(forKey: key)
    }
}
extension DataStorage {
    func updateSelected(index: Int?) {
        guard let index = index else {
            remove(forKey: Keys.selectedIndex.rawValue)
            return
        }
        saveSelected(index: index)
    }
    var selectedIndex: Int? {

        get {
            return get(forKey: Keys.selectedIndex.rawValue)
        }
        set {
            guard let index = newValue else {
                remove(forKey: Keys.selectedIndex.rawValue)
                return
            }
            saveSelected(index: index)
        }
    }
}

class SomeLoader {

    // MARK: - Public
    var dataStorage = DataStorage<Int>()
    var selectedIndex: Int? {
        get {
            return dataStorage.selectedIndex
        }
        set {
            dataStorage.updateSelected(index: newValue)
        }
    }
}

let someLoader = SomeLoader()
someLoader.selectedIndex = 1
print(someLoader)

标签: iosswift

解决方案


推荐阅读