在 Objective-C 与 Swift 的命名有明显的区别,虽然 Swift interface 可以将 Objective-C 的 API 以一定程度的方式改写为 Swift 命名方式。
Photo by @jontyson on Unsplash
Objective-C 的 Foundation/Foundtion.h
提供了 NS_SWIFT_NAME
作为改写 API 的关键字:
// Objective-C
NS_SWIFT_NAME(Sandwich.Preferences)
@interface SandwichPreferences : NSObject
@property BOOL includesCrust NS_SWIFT_NAME(isCrusty);
@end
@interface Sandwich : NSObject
@end
范例来自 Apple Developer Documentation [注 1]
其相对应的 Swift interface 则是
Swift interface 并不是万能的,在提供方便的 NS_SWIFT_NAME
的同时,有几个要避免的事情:
Sandwich.Preferences.Detail
是不能使用的// Objective-C
NS_SWIFT_NAME(Sandwich.Preferences.Detail) // 'swift_name' attribute has invalid identifier for base name
@interface SandwichPreferencesDetail : NSObject
@end
正确使用的方式是
NS_SWIFT_NAME(SandwichPreferences.Detail)
之前说到在 public header 的实作是会自动出现在 Swift interface 的,但是当我们想要透过改写 API 的顺序或是不想让 Swift client 使用不方便的 API (如: ObjcBool 与 Swift.Bool),我们可以使用 NS_REFINED_FOR_SWIFT
的关键字来处理。
// Objective-C
@interface Color : NSObject
- (void)getRed:(nullable CGFloat *)red
green:(nullable CGFloat *)green
blue:(nullable CGFloat *)blue
alpha:(nullable CGFloat *)alpha NS_REFINED_FOR_SWIFT;
@end
范例来自 Apple Developer Documentation [注 2]
// Swift
extension Color {
var rgba: (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) {
var r: CGFloat = 0.0
var g: CGFloat = 0.0
var b: CGFloat = 0.0
var a: CGFloat = 0.0
__getRed(red: &r, green: &g, blue: &b, alpha: &a)
return (red: r, green: g, blue: b, alpha: a)
}
}
请注意的是 __getRed
是不存在於 Swift interface 的。
>>: ## Day28 LineBot models小介绍
我们前面已经认识了函式作用域,也了解了回调函式,但有时候会产生意想不到的事情,造成内存问题,其中一...
Hash 在其他语言称为Object, Dictionary,但无论是在哪个程序语言中,Hash 和...
本来以为小验完可以回家的一周结果只是我以为QQ 已经大约3周没回家我,以为目前执行速度还在进度内,殊...
https://leetcode.com/problems/validate-binary-sea...
1.版本 https://nodejs.org/en/ 下载LTS (长期稳定版本) 用10以上版本...