swift注释apis的定义

时间:2014-11-22 00:12:42

标签: swift

我正在阅读此链接https://developer.apple.com/library/ios/documentation/swift/conceptual/buildingcocoaapps/WorkingWithCocoaDataTypes.html,在有关内存管理对象的部分中,他们讨论了带注释的API。但是,我无法找到带注释的API的定义。任何人都知道这意味着什么?

1 个答案:

答案 0 :(得分:3)

基本上,Apple必须通过所有API并使用有关参数和返回值的内存分配信息来注释每个函数。一旦完成,可以更容易地在Swift中使用带注释的函数,因为编译器知道如何安全地将类型从Swift代码到来回注释到带注释的C代码。

这是类似注释和未注释函数的示例。首先,C版本:

// Creates an immutable copy of a string.
CFStringRef CFStringCreateCopy ( CFAllocatorRef alloc, CFStringRef theString );

// Encodes an OSType into a string suitable for use as a tag argument.
CFStringRef UTCreateStringForOSType ( OSType inOSType );

这两个函数都返回CFStringRef - 对CFString的引用。 C CFString可以桥接到Swift CFString实例,但只有在注释方法时才能安全。以下是Swift版本:

// annotated: returns a memory-managed Swift `CFString`
func CFStringCreateCopy(alloc: CFAllocator!, theString: CFString!) -> CFString!

// unannotated: returns an *unmanaged* `CFString`
func UTCreateStringForOSType(inOSType: OSType) -> Unmanaged<CFString>!

如果您要拨打第二个,则需要在结果上调用.takeRetainedValue().takeUnretainedValue()以获取内存管理的CFString实例 - 知道哪一个,您必须阅读文档或了解约定,以了解您获得的结果是保留还是未保留。通过带注释的功能,Apple已经为您完成了这项工作。

论坛上有几个关于这个问题的主题,因为Apple也指出返回值是否应该是带注释的可选项,但是他们现在仍然非常接近。