1

我想围绕 NSURLSession 创建一个包装器,我发现了一些不错的代码,但它是用 Swift 编写的。https://github.com/daltoniam/SwiftHTTP。但是由于我仍然用Objective-C编写生产代码,我开始借用上面代码的想法,虽然我很难理解下面的代码并翻译成Objective-C(如果需要的话)。我知道我可以使用 AFNetworking,但由于构建可分发框架时的架构决策,这是不可行的。

编码:

    /// encoding for the request.
    public var stringEncoding: UInt = NSUTF8StringEncoding

// Somewhere in a method

    var charset = CFStringConvertEncodingToIANACharSetName(CFStringConvertNSStringEncodingToEncoding(self.stringEncoding));
if request.valueForHTTPHeaderField(contentTypeKey) == nil {
                    request.setValue("application/x-www-form-urlencoded; charset=\(charset)",
                        forHTTPHeaderField:contentTypeKey)
                }
                request.HTTPBody = queryString.dataUsingEncoding(self.stringEncoding)

我的 Objective-C 代码:

@property (assign, nonatomic) NSUInteger stringEncoding;

    // In this line I get a compiler warning and in runtime it crashes with BAD_EXC
        CFStringEncoding cfStringEncoding = CFStringConvertIANACharSetNameToEncoding(CFStringConvertNSStringEncodingToEncoding(self.stringEncoding));
                if (![mutableRequest valueForHTTPHeaderField:ContentTypeKey])
                    {
                    [mutableRequest setValue:[NSString stringWithFormat:@"application/x-www-form-urlencoded; charset=%u", (unsigned int)cfStringEncoding] forHTTPHeaderField:ContentTypeKey];
                    }
                mutableRequest.HTTPBody = [queryString dataUsingEncoding:self.stringEncoding];

编译器警告:

Incompatible integer to pointer conversion assigning to 'CFStringEncoding' (aka 'unsigned long') from 'CFStringRef' (aka 'const struct __CFString *')

我没有使用 CFStringEncoding 和 CFString 的丰富经验,所以我发现很难翻译文档。

我真的需要这种转换吗?它的目的是什么?

4

1 回答 1

0

尝试NSString改用:

NSString *charset =
        (NSString *)CFStringConvertEncodingToIANACharSetName
        (CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));

这是该版本之前通常使用的方法Swift,并且我记得AFNetworking使用了类似的方法(如果不同的话)。

于 2015-02-27T16:54:55.713 回答