在 Swift 中为 Objective C 函数提供 NSMutableArray 类型

Posted

技术标签:

【中文标题】在 Swift 中为 Objective C 函数提供 NSMutableArray 类型【英文标题】:Supplying NSMutableArray type to Objective C function in Swift 【发布时间】:2014-06-03 18:40:57 【问题描述】:

我有一个用Objective C 编写的库函数,它有一个指向NSMutableArray 的指针。但是,当我尝试使用 Swift 数组调用它时,会出现以下错误:

DiscoverViewController.swift:34:20: Could not find an overload for 'init' that
accepts the supplied arguments

但是,如果我通过 nil,它会起作用。这是有道理的。

这是一个 Objective-C 的例子:

int ex:(NSMutableArray *)in  return in.count; 

还有一个 Swift 的例子:

ex([1,2,3,4]) // doesn't compile

ex(nil) // does compile

如何将 Swift 数组转换/转换为我的库函数正在寻找的 NSMutableArray 类型?

这是完整的方法签名,以防我的示例过于简化:

- (id) initWithTitle: (NSString *) title place: (PublicPlaceInfo *) place
datetimeInterval: (DateTimeInterval *) datetimeInterval costBracket: (int)
costBracket creatorId: (PersonID) creatorId cover: (Url) cover experienceId: 
(ExperienceID) experienceId numJoined: (int32_t) numJoined relatedJoined: 
(NSMutableArray *) relatedJoined;

然后我知道它在relatedJoined 部分失败了,因为我将所有其他潜在的匿名实例化转换为变量。不得不说,这肯定不是最有用的编译错误..

【问题讨论】:

【参考方案1】:
ex([1,2,3,4]) // doesn't compile

这是因为您传递给它的是一个普通数组,而不是一个可变数组。尝试先将其转换为可变数组:ex(NSMutableArray([1,2,3,4]))

ex(nil) // does compile

nilNSMutableArray? 的有效参数,这就是它起作用的原因。

【讨论】:

好的,那么我让relatedJoined 参数等于var mutArr = [1,2,3,4],它仍然无法编译。但是根据文档,声明为“var”(而不是“let”)的数组是可变数组。 @phileaton: Swift 的ArrayNSArray 不一样。 Docs reference 将 Swift 中的数组视为 SWArray :-) 哈哈好吧,我想我只是很失望没有原生支持,因为 NSArray 和 NSMutableArray 在 Objective-C 中是如此基础。

以上是关于在 Swift 中为 Objective C 函数提供 NSMutableArray 类型的主要内容,如果未能解决你的问题,请参考以下文章

从 Swift 调用 Objective C 和 C 传递回调函数

使用 Swift 语言编写递归函数以遍历 Objective C 中的 Collection 对象

从objective-c++调用swift函数

将单例从 Objective C 共享到 Swift

Swift 无法识别这个特定的 Objective C 类构造函数

从 Swift 调用 Objective C 自定义初始化函数