2015-07-11 64 views
-3

我發現在Swift中使用KVC會導致很多問題,尤其是對於可選屬性。使用KVC的Swift可選屬性導致崩潰

這裏是我的具體的問題:

這裏是一個名爲類。它有一個名爲年齡的常規屬性,以及名爲ageOptional的可選(Int)屬性。

class Person: NSObject { 

    var age: Int 

    var ageOptional: Int? 


    override init(age: Int){ 

     self.age = 0 
    } 
} 

現在,我用KVC在人的實例:

//new a instance 
var person = Person() 

//kvc for normal property: it work well 
person.setValue(28, forKeyPath: "age") 


//but, this time ,it doesn't work well!!!! 
person.setValue(28, forKeyPath: "ageOptional") 

應用崩潰了,這裏是個例外:

2015年7月11日11:17:31.546 CFRuntime [4646:607] ***由於未捕獲的異常'NSUnknownKeyException',原因:'[setValue:forUndefinedKey:]:終止應用程序,該類不是關鍵值編碼兼容關鍵ageOptional。

我發現,如果一個屬性是可選的,KVC找不到密鑰。但是,我無法找到可選屬性的有用鍵,並解決了這種情況。

+2

刪除中文字符,這真的沒有必要,英文是人們在這裏使用的。並且真的不需要多個'!'字符。清晰並且格式良好的問題會得到答案。 –

+0

[的setValue:forUndefinedKey:] – charlin

回答

1

你已經完美解決了這個問題。您不能在可選的Int屬性上使用KVC,因爲KVC是Cocoa/Objective-C,Objective-C無法看到可選的Int - 它不會橋接到Objective-C。目標C只能看到是橋接到Objective-C的類型:即從NSObject的得出,暴露與@objc

  • 夫特結構

  • 類類型

    • 類類型這是橋接

    的Objective-C還可以看到一個可選wrapp幾乎所有這些類型。它可以看到一個可選的包裝橋接結構,但只有當該結構是直接橋接的。 Int is not直接橋接;它橋接到NSNumber,但不直接(它必須被包裝)。因此,Objective-C無法看到類型爲Int?的Swift成員。

    如果你確實需要這是一個可選項,並且如果你確實需要使用KVC,那麼將其聲明爲NSNumber?而不是Int?。就我個人而言,我懷疑這些事情是否屬實;因爲將我的所有應用程序從Objective-C轉換到Swift,我發現我實際上並不需要KVC內部,並且所有基於KVC的解決方案都可以通過其他更好的方法來完成。

  • +0

    哦,不,但是,我再次測試一個字符串可選性能及用途KVC,它的工作很好....... 類Person:NSObject的{ 變種名稱:字符串? } 然後 – charlin

    +0

    哦,不,但是,我再次測試一個字符串可選性能及用途KVC,它的工作很好....... 變數名稱:字符串? var person = Person() person.setValue(「張三」,forKeyPath:「name」) – charlin

    +0

    但不是'Int?'。如果你真的需要這是一個可選的,使用'NSNumber?'。 – matt