采用Objective-C协议并返回NSArray

时间:2015-07-07 20:36:53

标签: ios objective-c swift nsmutablearray nsarray

我有一个用Swift编写的委托类。我有一个Objective-C类,它具有此Swift类的委托属性。 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

2 个答案:

答案 0 :(得分:0)

您是否尝试过在availableChannels的<!1}}

的Swift实现中返回NSArray
private var socialChannels = NSMutableArray() 

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

答案 1 :(得分:0)

我解决了我的问题。 Objective-C代码试图将从Swift代码返回的NSArray分配给弱属性。我从来没有注意到这个弱小的财产。我把它改成了强大而且有效。我认为这个问题是针对AnyObject的演员。