2015-09-30 48 views
2

我有功能迅速valueForKeyPath不起作用

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值

+0

也許問題是難過的是沒有從NSObject的繼承? – Vlk

+0

我更新了描述,所以你可以看到SAd:NSObject –

+0

可能你必須在調用'valueForKeyPath'之前施加'object':'(object as!SAd).valueForKeyPath(field!)' – vadian

回答

4

你不能用可選的斯威夫特數值結構類型使用KVC,如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 
+0

我明白了,但真的很奇怪,我無法獲取可選變量的值。我認爲它必須以正確的方式存在 –

+0

我沒有具體的答案。我想這就是蘋果公司已經制定出來的。可能iOS會假定路徑可能是'nil','valueForKeyPath'必須採用非零值,所以這是運行時崩潰的預警。一個類似的線程 - > http:// stackoverflow。com/questions/27759284/about-swift-execution-was-interrupted-reason-exc-bad-instruction-code-exc-13 – Abhinav

+0

不,因爲String?運行良好,問題只在於Int? –