ios - 调用字符串扩展,包括从 Objective-C 用 Swift 编写的函数
问题描述
当 Swift 中的扩展只使用如下变量时:
extension NSString {
var isNumber: Bool {
return length > 0 && rangeOfCharacter(from: CharacterSet.decimalDigits.inverted).location == NSNotFound
}
}
我可以使用非常友好的语法从 Objective-C 调用它:
NSString *str = @"twelve";
BOOL isNumber = str.isNumber;
但是,当扩展程序使用如下函数时,我在语法上苦苦挣扎:
extension String {
func asImage(withAttributes attributes: [NSAttributedString.Key: Any]? = nil, size: CGSize? = nil) -> UIImage? {
let size = size ?? (self as NSString).size(attributes: attributes as! [String : Any])
if #available(iOS 10.0, *) {
return UIGraphicsImageRenderer(size: size).image { _ in
(self as NSString).draw(in: CGRect(origin: .zero, size: size),
withAttributes: attributes as! [String : Any])
}
} else {
// Fallback on earlier versions
return nil
}
}
这可以从 Swift 调用,只需:
var image = "Hello World".asImage()
但我不知道如何从 Objective-C 调用它。
事实上,autotype 甚至无法识别 str.asImage 并且当我尝试各种事情时,它会导致我陷入错误的兔子洞并修复导致其他错误的问题。
我如何从 Objective-C 调用上述扩展?
解决方案
Swift 类、扩展或协议只有在可转换或用@objc
.. 显式标记时才能在 Objective-C 中表示,这意味着它也要求所有参数也可转换为 Objective-C。
struct
也不能被转换,所以我们只剩下类(IE:类和具体类的扩展)并且要标记一个类@objc
,它必须继承NSObject
。
例子:
@objc
extension NSString {
func asImage(withAttributes attributes: [NSAttributedString.Key: Any]? = nil, size: CGSize = .zero) -> UIImage? {
let size = size == .zero ? self.size(withAttributes: attributes!) : size
if #available(iOS 10.0, *) {
return UIGraphicsImageRenderer(size: size).image { _ in
self.draw(in: CGRect(origin: .zero, size: size),
withAttributes: attributes!)
}
} else {
// Fallback on earlier versions
return nil
}
}
}
请注意,我将CGSize
参数更改为非可选参数并与零进行比较。
另请注意,我标记了它@objc
并将其更改为扩展名,NSString
因为String
它本身不能转换为 Objective-C,因为它是struct
!
然后在 Objective-C 中你可以这样称呼它:
[str asImageWithAttributes:@{....} size:CGSizeZero];
或者你想要的任何参数..
推荐阅读
- gnuplot - Gnuplot - 尝试创建瀑布/栅栏图
- r - 在 Shiny 中检查 rhandsontable 的有效输入
- java - 如何在 NetBeans 12 中增加内存/堆(netbeans_default_options)
- python - Python:合并 2 列
- c# - 从十进制转换为字符串时无用的替换
- python - 有没有办法加快 pd.read_excel() 从 .xlsm 文件中读取的速度?
- git - fortran的git diff中的函数上下文?
- c# - 如何使用 C# 写入一些具有多张工作表的 excel 工作表
- ios - 设置 HKQueryAnchor 时,如何绕过 iOS 12.0 中已弃用的“unarchiveObject(with:)”?
- docker - 使用 gitlab runner 和 gitlab-ci 自动本地部署 docker 容器,无需特权用户