当前位置: 首页 > 面试题库 >

如何注释在Swift中使用的Objective-C API(例如,返回类型)

杜思远
2023-03-14
问题内容

根据Xcode发行说明,Apple一直在“审核”其现有的API,以删除隐式解包的可选控件。这意味着T!它们的API会代替TT?在适当的地方返回。

他们在哪里做?如何注释/包装现有的Objective-C代码(尤其是库),以使其更易于在Swift中使用?


问题答案:

Xcode 6.3 / Swift 1.2

Xcode 6.3增加了对在Objective-C中注释可空性的官方支持。

可空性

值的空性可以通过注释与关键字的类型声明__nullable__nonnull__null_unspecified(默认值)。在属性和方法的关键字nullablenonnullnull_unspecified

Xcode发行说明中的​​示例

   - (void)registerNib:(nonnull UINib *)nib
forCellReuseIdentifier:(nonnull NSString *)identifier;

- (nullable UITableViewCell *)cellForRowAtIndexPath:(nonnull NSIndexPath)indexPath;

@property (nonatomic, readwrite, retain, nullable) UIView *backgroundView;

更改默认值

null_unspecified(翻译为T!)是所有现有代码的默认设置。一项有用的功能是能够更改API部分的默认设置。

NS_ASSUME_NONNULL_BEGIN
// nonnull is the default here
NS_ASSUME_NONNULL_END

这消除了很多噪音,因为接受和处理nil的方法通常是例外,而不是规则。就个人而言,我会将其用于所有审核的API。

null_resettable

null_resettable是一个额外的注释,用于不常见的情况,您可以 属性 设置 为nil,但永远不会
nil(因为它将重置为默认值)。

 @property (nonatomic, retain, null_resettable) UIColor *tintColor;

就个人而言,对于新代码,我会避免这种行为。此类属性的混合性质不适用于Swift。

Xcode 7 / Swift 2(测试版)

Xcode 7添加了对在Objective-C中注释通用类型的支持。

集合的通用类型注释

NSArrayNSSetNSDictionary(会自动桥接到Swift的ArraySetDictionary可以使用其内容类型进行注释。

@property NSArray<NSString *> *stringArray;
@property NSSet<NSString *> *stringSet;
@property NSDictionary<NSString *, NSString *> *stringDict;

还有一个__kindof关键字告诉Objective-C编译器不太严格,允许向下转换。但这并不影响Swift方面。

自定义类的通用类型注释

@interface MyArray1<__covariant T> : NSObject
- (void)addObject:(T)object;
@end

@interface MyArray2<__covariant T : NSObject *> : NSObject
- (void)addObject:(T)object;
@end

@interface MyArray3<__covariant T : id<NSCopying>> : NSObject
- (void)addObject:(T)object;
@end

他们@implementation不知道T并像往常一样使用id/ NSObject */ id<NSCopying>



 类似资料:
  • 这是简化的代码 那么如何在类型注释中使用名称Myclass呢?我的TypeScript版本是3.2.2

  • 问题内容: 我如何使用类型提示来注释一个返回总是返回两个值的函数:a和a ?提示很接近,除了将返回值类型限制为元组,而不是生成器或其他可迭代类型。 我主要是好奇的,因为我想注释一个用于返回多个值的函数,如下所示: 通常函数喜欢做这样的事情(它返回一个元组),但我喜欢的类型暗示要足够灵活,以取代发电机或列表或别的东西返回的元组。 问题答案: 您总是返回 一个 对象;使用只需返回一个元组。 是的,完全

  • 问题内容: 我正在尝试进行此扩展: 但是我得到了编译错误: 错误:无法将类型’UIViewController’的返回表达式转换为类型’Self’ 可能吗?我也想做到 问题答案: 与在Swift的类扩展函数中使用’self’类似,您可以定义一个通用的辅助方法,该方法可以从调用上下文中推断出self的类型: 然后 进行编译,并将类型推断为。 Swift 3 更新 : 另一种可能的解决方案,使用:

  • 问题内容: 我正在迁移课程,以便对Swift进行一些培训。我通过桥接头成功使用了Objective- C代码,但是我需要导入一个包含指令的常量文件。 我在结合Swift和Cocoa和Objective-C(简单宏)中看到以下内容: 简单宏 通常在C和Objective-C中使用指令定义原始常量的地方,在Swift中使用全局常量代替。例如,常数定义可以在Swift中使用更好地表达。由于简单的类似于常

  • 问题内容: 简单地说,我有一个存储应用程序常量的结构,如下所示: 例如,可以通过调用在Swift代码中使用这些常量。但是在我的代码中,它还包含一些Objective- C类。所以我的问题是如何在Objective-C代码中使用这些常量? 如果这种声明常量的方法不好,那么在Swift和Objective-C代码中使用全局常量的最佳方法是什么? 问题答案: 可悲的是,你不能暴露,也不是Objectiv

  • 我开始更多地使用Python3的类型支持,并且我希望能够注释作为替代构造函数的的返回类型。 下面是一个简单的例子;如果我包含注释,它将失败: 那么,在为类型注释定义类之前,如何引用类呢?