String.Encoding 没有在 swift 3 中转换为 NSStringEncoding 到目标 C 转换
Posted
技术标签:
【中文标题】String.Encoding 没有在 swift 3 中转换为 NSStringEncoding 到目标 C 转换【英文标题】:String.Encoding is not getting translated to NSStringEncoding in swift 3 to objective C conversion 【发布时间】:2016-11-08 11:57:21 【问题描述】:我正在将我现有的 swift 源代码库转换为 swift 3,并在 swift 类中有一个方法,该方法之前返回 NSStringEncoding。在 swift 3 中,编译器要求我将 NSStringEncoding 转换为 String.Encoding。但是这个方法现在没有反映在 Objective-c 生成的接口中,现在我不能在我的 Objective-c 类中调用这个方法。
这是一个示例代码 sn-p :
@objc
open class MyClass: NSObject
open var textEncoding: String.Encoding get return self.getEncoding()
fileprivate func getEncoding() -> String.Encoding
// some conversion code
return encoding
在一个objective-c类中,
-(void)demoFunc:(MyClass * _Nonnull)response
(i) NSStringEncoding responseEncoding = response.textEncoding;
编译器为上面的行抛出了这个错误,
在“MyClass”类型的对象上找不到属性“textEncoding” *'
由于我无法在 swift 文件中声明/使用 NSStringEncoding 而在 Objective C 中我无法使用 String.Encoding,我该如何解决这个问题?
【问题讨论】:
【参考方案1】:基金会定义
typedef NSUInteger NSStringEncoding;
NS_ENUM(NSStringEncoding)
NSASCIIStringEncoding = 1, /* 0..127 only */
// ...
;
映射到 Swift 为
extension String
public struct Encoding : RawRepresentable
public var rawValue: UInt
// ...
所以你可以做的就是将原始值传回Objective-C:
open var textEncoding: UInt return self.getEncoding().rawValue
【讨论】:
以上是关于String.Encoding 没有在 swift 3 中转换为 NSStringEncoding 到目标 C 转换的主要内容,如果未能解决你的问题,请参考以下文章
如何将字符串(例如“iso-8859-1”)转换为其对应的 String.Encoding?
Swift Playground - 实例成员不能用于类型自定义类