2016-05-26 25 views
2

我想從Swift類創建一個CGRect數組,最終將發送到Objective C類。CGrect NSArray error

據我所知,Objective C期望NSArrayNSMutableArray創建CGRect陣列時。我試圖讓一個NSArray和附加CGRect,壽它打印錯誤:

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

Swift代碼:

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

任何建議人?

回答

2

這不是一個NSArray

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]'。爲了解決這個問題,您可以簡單地在您的陣列上使用map - 以便在將每個CGRect發送到Objective-C之前將其包裝在NSValue中。

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

這樣你就可以擁有兩全其美了。您可以在Swift中使用CGRects數組獲得靈活性和類型安全性,並且您還可以獲得與Objective-C的互操作性。

1

如果你需要創建在迅速CGRect數組,你可以這樣寫:

var rectList = [CGRect]() 

let rect1 = CGRectZero 
rectList.append(rect1) 

在你的情況,你正在創建數組的數組。這就是爲什麼它說:「無法將類型的價值‘NSValue’預期參數類型‘的NSArray’」