gpt4 book ai didi

objective-c - 我如何从 Objective-C 实现序列(以允许 Swift 的 for-in 语法)?

转载 作者:搜寻专家 更新时间:2023-10-31 19:33:27 26 4
gpt4 key购买 nike

我正在用 Objective-C 编写一个 API,希望它能在 Swift 中很好地发挥作用。不过,我在使用“for..in”语法时遇到了问题。我想我需要实现 Sequence 协议(protocol),但我找不到任何从 Objective-C 执行此操作的示例。只是引用 Sequence 给我 error: no type or protocol named 'Sequence'。是否有特殊的 #import 来访问它或其他东西?

我尝试实现 NSFastEnumeration 协议(protocol),认为它可能会在 Swift 中神奇地转换为 Sequence,但那没有用。

///// Obj-C Code
@interface Foo : NSObject<NSFastEnumeration>
...
@end

///// Swift Code
var foo: Foo = Foo()

// ERROR: Type 'Foo' does not conform to protocol 'Sequence'
for y in foo {
print("Got a y.")
}

编辑:看起来从 NSEnumerator 继承让我更接近,但也不太奏效:

///// Obj-C Code
@interface Foo : NSEnumerator<NSString *>
...
@end

///// Swift Code
// ERROR: 'NSFastEnumerationIterator.Element' (aka 'Any') is not convertible to 'String'
for y: String in foo {
print("Got \(y)")
}

编辑 2: 我仍然没有好的解决方案并记录了一个错误:https://bugs.swift.org/browse/SR-2801

最佳答案

Foundation 的 Swift 扩展包括一些支持,使采用 NSFastEnumeration 的类也支持 Swift Sequence 协议(protocol)...但不是自动的。

一种方法是在 Swift 中扩展您的 ObjC 类型并传递给 NSFastEnumerationIterator 类型:

extension Foo: Sequence {
public func makeIterator() -> NSFastEnumerationIterator {
return NSFastEnumerationIterator(self)
}
}

NSFastEnumerationIterator(以及所有形式的 ObjC 枚举)是类型删除,因此它们不提供任何关于您正在迭代的元素类型的信息。这意味着您可以这样做(在添加上述扩展后):

var foo: Foo = Foo()
for y in foo {
print("Got a y.")
}

...但是 y 的静态类型始终是 Any。如果您想要对 foo 的成员进行类型化访问,则需要强制转换或过滤循环:

for y in foo where y is String {
print("Got \(y)")
}

可悲的是,如果您的类采用 ObjC 泛型,似乎没有办法让它工作——您会收到错误 “泛型 Objective-C 类的扩展无法访问类在运行时的通用参数”,即使您采用了 SE-0057 中的运行时类型自省(introspection)方法.不过,对于非泛型 ObjC 类,你很不错。

关于objective-c - 我如何从 Objective-C 实现序列(以允许 Swift 的 for-in 语法)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39757563/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com