【问题标题】:Adopting Objective-C protocol and returning NSArray采用Objective-C协议并返回NSArray
【发布时间】:2015-09-25 13:03:21
【问题描述】:

我有一个用 Swift 编码的委托类。我有一个具有这个 Swift 类的委托属性的 Objective-C 类。 Swift 委托类采用具有 NSArray* 类型所需属性的 Objective-C 协议。 Swift 代码构建了一个可变数组类 var,然后将其作为 [AnyObject] 返回。

可变数组的构建以及将其分配给 Swift 类 var 是可行的,但有时该函数会将 nil 返回给我的 Objective-C 类。

当我设置断点并逐行执行时,它可以工作,但如果我让它运行,它每次都返回 nil。

我还添加了日志语句,验证 Swift 类每次都构建可变数组,但 Objective-C 代码一直为零。我唯一要做的就是将我的 Objective-C 协议属性更改为 NSMutableArray ,但这似乎我绕过了这个问题。如何使用 NSArray 完成这项工作?

如果我让 Swift 代码返回 NSArray!我收到一个编译错误,说 Swift 类没有实现所需的委托方法。

如果我将 Swift 代码更改为返回

Array<AnyObject>

它可以编译,但仍然存在将 nil 返回到我的 Objective-C 类的相同问题。

Objective-C 协议如下所示:

@protocol MySocialDelegate <NSObject>
-(NSArray*)availableChannels;
@end

Swift 委托类如下所示:

class MySocialDelegateSwiftClass: NSObject, MySocialDelegate {

    private var socialChannels = NSMutableArray()

    func availableChannels() -> [AnyObject]! {

        if ( self.socialChannels.count == 0 ) {
            let channel = ...getChannel()
            if ( channel != nil && channel?.guid != nil ) {
                self.socialChannels.addObject(channel)
            }

            if( someCondition ) {
                let channel = ...getChannel()
                if ( channel != nil && channel?.guid != nil ) {
                    self.socialChannels.addObject(channel!)
                }
            }
        }

        // self.socialChannels will contain 2 objects

        return self.socialChannels as [AnyObject]
    }
}

调用该 Swift 委托的 Objective-C 类看起来像这样:

ViewController *vc = [[UIStoryboard storyboardWithName... 
vc.socialDelegate = instanceOfMySocialDelegateSwiftClass;
if([vc.socialDelegate respondsToSelector:@selector(availableChannels)])
    vc.availableChannels = [vc.socialDelegate availableChannels];

// vc.availableChannels will be nil

【问题讨论】:

    标签: ios objective-c swift nsmutablearray nsarray


    【解决方案1】:

    您是否尝试过在availableChannels 的 Swift 实现中返回一个 NSArray?

    private var socialChannels = NSMutableArray() 
    
    func availableChannels() -> NSArray? {
       ...
       return self.socialChannels  // socialChannels is a NSMutableArray
    }
    

    【讨论】:

    • 当我将返回类型更改为 NSArray 时?然后我得到一个编译错误,说 swift 类不符合协议:(
    【解决方案2】:

    我解决了我的问题。 Objective-C 代码试图将从 Swift 代码返回的 NSArray 分配给一个弱属性。我什至从未注意到弱属性。我将其更改为强,并且可以正常工作。我认为问题在于对 AnyObject 的演员表。

    【讨论】:

      猜你喜欢
      • 2016-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多