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 - 实例成员不能用于类型自定义类

用 Kanna 快速解析 html

无法使用类型为“(String.UTF8View)的参数列表调用类型“UInt32”的初始化程序

php 多字节编码转换

在PHP中反转多字节字符串