【问题标题】:Not able to convert objective-c code to swift 4无法将objective-c代码转换为swift 4
【发布时间】:2018-10-26 02:30:27
【问题描述】:

谁能帮我把这个objective-c函数转换成swift4? 我已经尝试过 Swiftify,但它给出了错误的输出。我也尝试过将字符串转换为数据,但输出错误。

- (NSData *)stringToData{
if (!HCKBluetoothValidStr(self)) {
    return nil;
}
if (!(self.length % 2 == 0)) {
    return nil;
}
Byte bytes[255] = {0};
NSInteger count = 0;
for (int i =0; i < self.length; i+=2) {

    NSString *strByte = [self substringWithRange:NSMakeRange(i,2)];
    NSLog(@"strbyte is: %@ \n\n",strByte);
    unsigned long red = strtoul([strByte UTF8String],0,16);
    Byte b =  (Byte) ((0xff & red) );//( Byte) 0xff&iByte;
    bytes[i/2+0] = b;
    count ++;
}
NSData * data = [NSData dataWithBytes:bytes length:count];
return data;

}

对于相同的函数输入字符串是:

NSString *commandStr = @"1702030a0a";

NSData 格式的函数输出为:

<1702030a 0a>

编辑 1:

我尝试将其转换为 swift,但 strString.utf8CString 给出错误为“无法将 'ContiguousArray'(又名 'ContiguousArray')类型的值转换为预期的参数类型 'UnsafePointer!'”

func stringToData(stringVal: NSString) -> NSData {
    var bytes: [UInt8] = [0]
    var count: Int = 0
    var i = 0
    for index in stride(from: 0, to: stringVal.length , by: 2) {
        var strByte: NSString = stringVal.substring(with: NSMakeRange(index, 2)) as NSString
        print("strbyte is: \(strByte) \n\n")
        let strString = String(strByte)
        print(strString)
        var red: UInt8 = strtoul(strString.utf8CString, 0, 16)


        let b = UInt8((0xff & red))
        count = count+1
    }
    var data = NSData(bytes: bytes, length: count)
    return data
}

【问题讨论】:

    标签: objective-c xcode utf-8 swift4 nsdata


    【解决方案1】:

    谁能帮我把这个objective-c函数转换成swift4?

    您的函数采用表示十六进制数字的字符串并转换每一对 if 字符(两个十六进制数字,每个表示 4 个二进制位)并生成表示的字节值,即 8 个二进制位。

    忽略 Objective-C 中的所有内容,除了对 HCKBluetoothValidStr 的调用,它可能会检查输入字符串是否有效 你仍然希望调用它,并编写你自己的 Swift 代码来将 String 转换为 Data。您需要将每个十六进制字符映射到它所代表的整数;即"3"3"c"12 等;并将它们成对组合;例如类似byteValue = firstDigitValue * 16 + secondDigitValue

    如果您遇到问题,请提出一个新问题,展示您的 Swift 代码,毫无疑问有人会从那里帮助您。

    【讨论】:

    • 我已经编辑了问题并添加了我的转换代码。你能帮我解决这个问题吗?
    • 你试图模仿 Objective-C ——不要。你在 Swift 中有一个String,编写你自己的代码来处理它——查看String 上可用的函数,考虑获取单个字符,将这些字符映射到整数值,组合这些值(例如,如答案所示)等。你不需要使用C函数strtoul(),你不需要使用NSMakeRange()——使用Swift。 (如果您仍然卡住,最好提出新问题,不要继续编辑这个问题,因为它开始询问如何转换 Objective-C 并且不将十六进制字符串解析为 Swift 中的字节。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多