是否可以将“AnyObject”强制转换为快速结构

时间:2015-04-28 13:22:15

标签: ios objective-c swift struct objective-c-swift-bridge

我有一个swift方法,它接收一个struct作为参数。 由于结构没有桥接到objective-c,因此该方法在桥接头中是不可见的 我被迫创建了一个新的“相同”方法,它接收“AnyObject”而不是原始方法所需的结构。

现在我的任务是从“AnyObject”实例化swift结构。 在这种情况下,是否可以将“AnyObject”“转换”为快速结构?

我是否被迫编写样板来构建来自AnyObject的快速结构?

我可以发送一个代表结构键值对的NSDictionary。这有什么用?

例如:

斯威夫特

struct Properties {
  var color = UIColor.redColor()
  var text = "Some text" 
}

class SomeClass : UIViewController {
  func configure(options : Properties) {
    // the original method 
    // not visible from 
  }
  func wrapObjC_Configure(options : AnyObject) {
    // Visible to objective-c
    var convertedStruct = (options as Properties) // cast to the swift struct
    self.configure(convertedStruct)
  }
}

目标-C

SomeClass *obj = [SomeClass new]
[obj wrapObjC_Configure:@{@"color" : [UIColor redColor],@"text" : @"Some text"}]

2 个答案:

答案 0 :(得分:1)

您可以使用NSValue并在其中包含您的结构,发送NSValue然后从中获取结构值,

NSValue的样本类别为:

@interface NSValue (Properties)
+ (instancetype)valuewithProperties:(Properties)value;
@property (readonly) Properties propertiesValue;
@end

@implementation NSValue (Properties)
+ (instancetype)valuewithProperties:(Properties)value
{
    return [self valueWithBytes:&value objCType:@encode(Properties)];
}
- (Properties) propertiesValue
{
    Properties value;
    [self getValue:&value];
    return value;
}
@end

有关NSValue的更多信息,请访问https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSValue_Class/

答案 1 :(得分:0)

您不能使用anyObject来表示结构。您只能将AnyObject与类实例一起使用。

您可以尝试使用Any,这可以代表任何类型的实例,包括函数类型。