【问题标题】:swift valueForKeyPath doesn't work快速 valueForKeyPath 不起作用
【发布时间】:2015-12-28 03:15:06
【问题描述】:

我有功能

func findObjectInArray(array: [AnyObject], field: String?, fieldValue: AnyObject, startFromTheBeginning: Bool, minIndexTemp: Int, maxIndexTemp: Int) -> AnyObject?

我有:

var minIndex = minIndexTemp
        var maxIndex = maxIndexTemp
        if (array.count == 0 || minIndex < 0 || maxIndex < 0) {
            return nil
        }
        if (minIndex > maxIndex) {
            let rem = minIndex;
            minIndex = maxIndex;
            maxIndex = rem;
        }
        if (maxIndex >= array.count) {
            maxIndex = array.count - 1;
        }
        let startIndex = startFromTheBeginning ? minIndex : maxIndex;
        let endIndex = startFromTheBeginning ? maxIndex : minIndex;

        for (var i = startIndex; (startFromTheBeginning ? i <= endIndex : i >= 0); (startFromTheBeginning ? i++ : i--)) {
            let object = array[i]
            var objectFieldValue: AnyObject? = nil
            if (field != nil) {
                print("test = ", (object as! SAd).adID)
                objectFieldValue = object.valueForKeyPath(field!)
            }

我在崩溃前记录我看到 test = 1 。所以这意味着object 被转换为SAd 并且它具有adID 字段,但是在objectFieldValue = object.valueForKeyPath(field!) 行上应用程序崩溃并出现错误:

 *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<Project.SAd 0x12d731930> valueForUndefinedKey:]: this class is not key value coding-compliant for the key adID

这里是类

class SAd: NSObject {
    var adID: Int!
    var bloggerID: Int!
    var createdOn: NSDate!
    var duration: Int!
    var fav: Int!
    var price: Double!
    var text: String!
    var countries: [String]!
    var categories: [String]!
    var deleted: Bool!
}

实际上,您可以非常简单地在代码中测试相同的行为:

创建类:

class STest: NSObject {
    var idTest: Int?
    var strTest: String?
}

在您的 AppDelegate 文件中:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    let testObj1 = STest()
    testObj1.idTest = 1
    testObj1.strTest = "test"
    let objValue = testObj1 .valueForKeyPath("idTest")

    return true
}

您将在let objValue = testObj1 .valueForKeyPath("idTest") 行看到崩溃

但如果你用let objValue = testObj1 .valueForKeyPath("strTest") 替换这一行,它会起作用。所以问题出在 Int 值上

【问题讨论】:

  • 也许问题是 SAd 没有从 NSObject 继承?
  • 我更新了描述,所以你可以看到 SAd: NSObject
  • 在调用 valueForKeyPath 之前,您可能还需要转换 object : (object as! SAd).valueForKeyPath(field!)
  • 我尝试了 objectFieldValue = (object as!SAd).valueForKeyPath(field!) ,但没有帮助,我有同样的错误
  • 我在操场上测试了这个,我可能没有得到同样的错误,但它让我失败了,因为 adID 声明为:Int!,当我将它设置为 var adID:Int = 2 时通过了我知道它不是真正的解决方案,而是它的东西:)

标签: ios iphone xcode swift properties


【解决方案1】:

您不能将 KVC 与可选的 Swift 数字结构类型一起使用,例如 IntUIntFloatDoubleBool。简单来说就是这些类型不兼容AnyObject,无法桥接。

在您的示例中,您可以使用:

var adID: NSNumber!

【讨论】:

    【解决方案2】:

    您不能将valueForKeyPathOptionals 一起使用。由于您将idTest 声明为可选,因此您将遇到此崩溃。试试下面的代码,它应该可以工作!

    class STest: NSObject {
        var idTest: Int = 0
        var strTest: String?
    }
    
    let testObj1 = STest()
    testObj1.idTest = 1
    testObj1.strTest = "test"
    let objValue = testObj1.valueForKeyPath("idTest") as! Int
    

    【讨论】:

    • 我明白了,但是我不能得到可选变量的值真的很奇怪。我认为它必须以正确的方式存在
    • 我没有具体的答案。我想这就是苹果公司的布局。可能 iOS 假设路径可以是 nilvalueForKeyPath 必须采用非零值,因此这是运行时崩溃的预警。类似的线程 --> stackoverflow.com/questions/27759284/…
    • 不,因为字符串?运行良好,问题仅出在 Int 上?
    • valueForKeyPath 自这篇文章以来显然已重命名;每个操场错误提示的最后一行现在工作为:let objValue = testObj1.value(forKeyPath: "idTest") as! Int
    猜你喜欢
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多