能否将“AnyObject”转换为Swift结构体?

5

我有一个快捷的方法,它接收一个结构体作为参数。由于结构体没有桥接到Objective-C,这个方法在桥接头文件中是不可见的。
我被迫创建了一个新的“完全相同”的方法,它接收"AnyObject"而不是原始方法所需的结构体。

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

我是否必须编写模板来从AnyObject构造Swift结构体?

我可以发送一个表示结构体键值对的NSDictionary,这有助于解决问题吗?

例如:

Swift

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)
  }
}

Objective-c

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

你不可以使用 Any 替代 AnyObject 吗? - Swapnil Luktuke
那对于从Objective-C调用转换为Swift结构体会有什么帮助? - Avba
AnyObject是一个适用于类而非结构体的协议。它有助于使用@objc - qwerty_so
你能把 Properties 改成一个 class 而不是一个 struct 吗?这样你就可以在 Objective-C 中使用它了。 - vacawama
我不想它成为一个类 - 我想它成为一个结构体 - 这只是一个人为的例子。 - Avba
2个回答

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/


0

你不能使用anyObject来代表结构体,它仅限于与类实例一起使用。

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


1
你不能将“Any”桥接到Objective-C。 - Avba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接