gpt4 book ai didi

objective-c - 在 Swift 3 中扩展 ObjC 泛型

转载 作者:IT王子 更新时间:2023-10-29 05:21:57 25 4
gpt4 key购买 nike

Swift 3 附带 SE-0057实现,除其他事项外,意味着:

By default, extensions of parameterized Objective-C classes cannot reference the type parameters in any way. For example:

extension MySet {
func someNewMethod(x: T) { ... } // error: cannot use `T`.
}

... 其中 MySet在 ObjC 中声明为 @interface MySet<T : id<NSCopying>> : NSObject .

一切都很清楚(甚至可能有某种解决方法)。但是,尽管我没有使用我试图扩展的 ObjC 类中的任何类型参数,但以下内容不会编译。我只使用另一个不相关的 Swift 类作为扩展方法的返回参数:

class Foo { }
struct Bar { }

extension MySet {
func foo() -> Foo { return Foo() } // Both produce: Extension of a generic
func bar() -> Bar { return Bar() } // Objective-C class cannot access the
} // class's generic parameters at runtime

这是一个错误吗?还是我遗漏了什么?

最佳答案

详情

xCode 8.3.1,swift 3.1

示例

MySet.h

#import <Foundation/Foundation.h>

@interface MySet<T : id<NSCopying>> : NSObject

@end

typedef struct ObjCStruct
{
__unsafe_unretained NSString* str;
int num;
} ObjCStruct;

MySet.m

#import "MySet.h"

@implementation MySet

@end

MySetExtension.swift

import Foundation

class Foo: NSObject {
var str = "Foo"
var num = 1
}

extension ObjCStruct {

init() {
num = 2
str = Unmanaged.passRetained("ObjCStruct")
}
}

extension MySet {
func foo() -> Foo { return Foo() }
func bar() -> ObjCStruct { return ObjCStruct() }
}

Bridging-Header

#import "MySet.h"

用法

NSLog(@"%@", [set foo].str);
NSLog(@"%@", [set bar].str);

关于objective-c - 在 Swift 3 中扩展 ObjC 泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39604010/

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