1

私は NSArray からの可変コンテンツを持っています:let content = application["content"]!

コンテンツを印刷すると、文字列があります: print(content)->My content

しかし、変数を String にキャストしたい場合:let content = application["content"]! as! String

null であるため、変数を出力できません: print(content)->Could not cast value of type 'NSNull' (0x1a0507768) to 'NSString' (0x1a0511798).

なんで ?

アップデート :

値がキャストされていないときの私の配列:

{
    "application_title" = "Marina Kaye";
    "application_type" = discussions;
    "application_type_name" = Discussions;
    content =     (
                {
            content = "Le nouvel album de Marina Kaye";
            link = "?message_id=118";
        },
                {
            content = "Son album est num\U00e9ro 1 des";
            link = "?message_id=131";
        },
                {
            content = "Le nouvel album s'appel";
            link = "?message_id=126";
        }
    );
    "content_title" = "Messages utiles";
    "content_type" = "useful_messages";
}

値がキャストされたときの私の配列:

{
    "application_title" = "Marina Kaye";
    "application_type" = discussions;
    "application_type_name" = Discussions;
    content = "<null>";
    "content_title" = "<null>";
    "content_type" = "usefull_messages";
}

コンテンツを NSArray に、content_title を String にキャストできません。

私のコード:

    let applicationsArray = result["applications"]! as! NSArray

    for application in applicationsArray {

        let applicationTitle = application["application_title"]! as! String
        let applicationType = application["application_type"]! as! String
        let applicationTypeName = application["application_type_name"]! as! String
        let content = application["content"]! as! NSArray
        let contentTitle = application["content_title"]! as! String
        let contentType = application["content_type"]! as! String
        self.listApplications.append(Application(applicationTitle: applicationTitle, applicationType: applicationType, applicationTypeName: applicationTypeName, content: content, contentTitle: contentTitle, contentType: contentType))
    }
4

1 に答える 1

3

NSArraySwift でコーディングしているため、レガシーとNSDictionary型は必要ありません。代わりに、これらは nowArrayDictionaryですが、気にする必要さえありません。

配列を宣言するには、通常、 のように角かっこで型を指定します[String]。ディクショナリの場合、キーと値の両方にこれが必要で、コロンで区切られます (例: [String: AnyObject].

ログ出力から、[String: AnyObject]6 つのキーを持つタイプの Dictionary が得られます。String1 つを除いて、それらはすべてオブジェクトを指します"content"

キーは明らかに辞書"content"の配列を指しています。これは次のように書かれています。したがって、 this へのキャストが成功しないことは驚くべきことではありません。[[String: AnyObject]]String

application辞書の「コンテンツ」を解析する方法は次のとおりです。

if let content = application["content"] as? [[String: AnyObject]] {
   for item in content {
       let text = content["content"] as? String
       let link = content["link"] as? String
       // do something with this data
   }
}

classorを定義してstruct、アプリケーション オブジェクトをキャプチャすることをお勧めします。コードがより明確になり、保守が容易になります。

于 2015-12-16T17:04:36.347 に答える