2016-04-15 11 views
3

どのようにプロトコルインスタンスの配列をAnyObjectにダウンキャストしますか?私は以下のコード例でより合理的なアイディアのいくつかを試しました。何が価値があるためにSwift AnyObject - プロトコルの配列を[AnyObject]にキャストダウン

protocol Nameable : class { 
    var name: String { get } 
} 

class Person: Nameable { 
    var name: String 

    init(name: String) 
    { 
     self.name = name 
    } 
} 

class Example { 

    func setArray(array: [AnyObject]?, forKey: String) 
    { 
     print("hello world") 
    } 
} 

var personOne = Person(name: "Evan") 
var personTwo = Person(name: "Brian") 

var array: [ Nameable ] = [ personOne, personTwo ] 

var anotherArray = array.map({ $0 as AnyObject }) // OMG gross! 
var yetAnotherArray = array as [ AnyObject ]   // Nope. 
var evenYetAnotherArray = array as? [ AnyObject ] // Nope. 
var omgThisIsAnArray = Array<AnyObject>(array)  // Ha ha, srsly. Nope. 

var myExample = Example() 
myExample.setArray(anotherArray, forKey: "Named") 

setArray(_ anArray: [AnyObject]?, forKey aKey: String)メソッドのシグネチャは、AppleのNSUbiquitousKeyValueStoreクラスから来ているので、私は本当にそれが安全なタイプであることを再設計することはできません。これは本当にない

var array: [Nameable] = [personOne, personTwo] 
let array2 = array as [AnyObject] // ✓ 
+0

オブジェクトが 'AnyObject'に準拠しているがその型がより明確な場合、メソッドのシグネチャに一致するようにオブジェクトを' AnyObject'にキャストする必要はありません。あなたの答えでは、エリックが答えているように、問題は 'NSUbiquitousKeyValueStore'がプロパティリストに準拠した型だけをサポートしていることです。 – vadian

答えて

4

これは完璧な未満ですが、プロトコルおよびクラスは両方@objc(およびクラスのサブクラスNSObject)がある場合、それは動作します直接あなたの質問に答えてください、しかし、私はあなたが期待するようにこれが動作するとは思わない。

内容プロパティリスト形式で格納することができる配列:NSUbiquitousKeyValueStoreはsetArrayためのドキュメントから

。換言すれば、アレイ内のオブジェクトは、タイプのNSNumberNSStringのNSDateのNSDataにNSArray、又はNSDictionaryのでなければなりません。配列とその内容の合計サイズ(バイト単位)は、キーごとのサイズ制限を超えてはいけません。

上記のいずれにも該当しないデータを入力しようとしていますが、問題が発生すると思います。

import UIKit // For String<->NSString bridging 

protocol Nameable : class { 
    var name: String { get } 
} 

class Person: Nameable { 
    var name: String 

    init(name: String) 
    { 
     self.name = name 
    } 
} 

class Example { 

    func setArray(array: [AnyObject]?, forKey: String) 
    { 
     print("hello world") 
    } 
} 

var personOne = Person(name: "Evan") 
var personTwo = Person(name: "Brian") 

var array: [ Nameable ] = [ personOne, personTwo ] 

var nameArray = array.map({ $0.name }) // Now [String] 

var myExample = Example() 
myExample.setArray(nameArray, forKey: "Named") 

をまたはあなたのスウィフトがサポートされているクラスの一つにそれらを得るためにいくつかの他の方法をオブジェクト直列化できます。このような

何かが働くだろう。

+1

ありがとう!ここで重要なのは、 'AnyObject'に' @ objc'というアノテーションが付けられていますが、私のプロトコルは_not_です。したがって、キャストすることは不可能です。 – edelaney05

0

@objc protocol Nameable: class { 
    var name: String { get } 
} 

@objc class Person: NSObject, Nameable { 
    var name: String 
    init(name: String) { 
     self.name = name 
    } 
} 

...:

関連する問題