2016-05-26 7 views
2

SwiftクラスからCGRect配列を作成しようとしていますが、最終的にObjective Cクラスに送信されます。CGrect NSArrayエラー

私が理解する限り、CGRectアレイを作成する場合、はNSArrayまたはNSMutableArrayと予想されます。

Cannot convert value of type 'NSValue' to expected argument type 'NSArray' 

スウィフトコード:

  var rects = [NSArray]() 
      let v = NSValue(CGRect: feature.bounds) 
      rects.append(v) 

任意の提案の人々私はそれがエラーを印刷カントー、CGRectを追加NSArrayとを作ってみましたか?

答えて

2

これはNSArrayではありません「型の値 『NSArrayの』期待引数の型に 『NSValue』に変換できません」だからこそがある:

var rects = [NSArray]() 

これはNSArrayオブジェクトのスウィフト配列である(つまり、配列内の配列)。 NSValuesを配列に追加する場合は、[NSValue]が必要です。

var rects = [NSValue]() 
let v = NSValue(CGRect: feature.bounds) 
rects.append(v) 

しかし、私は一般的にこれを行うことに対して、それはスウィフト自身が必要としないラッパーだけでなく、型の安全性を減らすことを追加して(あなたの正確なユースケースによって異なります)助言します。 Objective-C APIに送る前にSwiftでこの配列とやりとりする必要がある場合は、代わりにCGRectsの配列を@Bhushan suggestsとして直接作成します。

var rects = [CGRect]() 
rects.append(CGRect(x: 50, y: 50, width: 100, height: 100)) 

しかし、あなたは今NSArray引数に、この配列を渡すことはできません、あなたはCannot convert value of type '[CGRect]' to '[AnyObject]'を言ってエラーが発生します。これに対処するには、それぞれCGRectNSValueにラップするために、Objective-Cに送信する前に、mapを配列に使用するだけです。

someObjCInstance.someProperty = rects.map{NSValue(CGRect:$0)} 

このようにして、両方の世界の利点を生かすことができます。 SwiftでCGRectsの配列を使用できる柔軟性とタイプセーフティが得られ、Objective-Cとの相互運用性も得られます。

1

あなたはこのように書くことができ、迅速でCGRect配列を作成する必要がある場合:あなたのケースでは

var rectList = [CGRect]() 

let rect1 = CGRectZero 
rectList.append(rect1) 

を使用すると、配列の配列を作成しています。その言っ

関連する問題