首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CGrect NSArray误差

CGrect NSArray误差
EN

Stack Overflow用户
提问于 2016-05-26 09:21:29
回答 2查看 491关注 0票数 2

我正在尝试从一个CGRect类创建一个Swift数组,这个数组最终将被发送到一个Objective C类。

据我所知,Objective C在创建CGRect数组时需要一个NSArrayNSMutableArray。我尝试创建一个NSArray并附加CGRect,然后打印错误:

代码语言:javascript
复制
 Cannot convert value of type 'NSValue' to expected argument type 'NSArray'

Swift代码:

代码语言:javascript
复制
            var rects = [NSArray]()
            let v = NSValue(CGRect: feature.bounds)
            rects.append(v)

各位,有什么建议吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-26 10:19:40

这不是NSArray

代码语言:javascript
复制
var rects = [NSArray]()

这是一个NSArray对象的Swift数组(即数组中的一个数组)。如果要将NSValues附加到数组中,则需要一个[NSValue]

代码语言:javascript
复制
var rects = [NSValue]()
let v = NSValue(CGRect: feature.bounds)
rects.append(v)

但是,我通常建议不要这样做(取决于您的确切用例),因为它添加了Swift本身不需要的包装器,并降低了类型安全性。如果您需要在将该数组发送到Objective之前在Swift中与该数组进行交互,那么我将直接创建一个CGRects数组,作为@Bhushan suggests

代码语言:javascript
复制
var rects = [CGRect]()
rects.append(CGRect(x: 50, y: 50, width: 100, height: 100))

但是,您现在不能将这个数组传递给NSArray参数,您将得到一个错误:Cannot convert value of type '[CGRect]' to '[AnyObject]'。为了处理这个问题,您只需在数组上使用map -以便在发送到目标C之前将每个CGRect封装在NSValue中。

代码语言:javascript
复制
someObjCInstance.someProperty = rects.map{NSValue(CGRect:$0)}

这样你就可以得到最好的两个世界。您可以在Swift中使用CGRects数组的灵活性和类型安全性,还可以获得与Objective的互操作性。

票数 2
EN

Stack Overflow用户

发布于 2016-05-26 09:31:00

如果您必须快速地创建CGRect数组,您可以这样编写:

代码语言:javascript
复制
var rectList = [CGRect]()

let rect1 = CGRectZero
rectList.append(rect1)

在您的示例中,您正在创建数组数组。这就是为什么“不能将'NSValue‘类型的值转换为预期的参数类型’NSArray‘的原因。”

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37456630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档