ios - 在 SWIFT 中转换 ObjectiveC 表达式

标签 ios objective-c swift

我正在实现一个简单的应用程序,它将从 Google map 下载数据,并在 map 上显示这些数据。我实现了所有代码以从 Google 获取此信息,现在我正在尝试实现解码多段线的方法。我用 ObjectiveC 编写了以下方法:

-(NSMutableArray *)decodePolyLine:(NSString *)encodedStr {
    NSMutableString *encoded = [[NSMutableString alloc] initWithCapacity:[encodedStr length]];
    [encoded appendString:encodedStr];
    [encoded replaceOccurrencesOfString:@"\\\\" withString:@"\\"
                                options:NSLiteralSearch
                                  range:NSMakeRange(0, [encoded length])];
    NSInteger len = [encoded length];
    NSInteger index = 0;
    NSMutableArray *array = [[NSMutableArray alloc] init];
    NSInteger lat=0;
    NSInteger lng=0;
    while (index < len) {
        NSInteger b;
        NSInteger shift = 0;
        NSInteger result = 0;
        do {
            b = [encoded characterAtIndex:index++] - 63;
            result |= (b & 0x1f) << shift;
            shift += 5;
        } while (b >= 0x20);
        NSInteger dlat = ((result & 1) ? ~(result >> 1) : (result >> 1));
        lat += dlat;
        shift = 0;
        result = 0;
        do {
            b = [encoded characterAtIndex:index++] - 63;
            result |= (b & 0x1f) << shift;
            shift += 5;
        } while (b >= 0x20);
        NSInteger dlng = ((result & 1) ? ~(result >> 1) : (result >> 1));
        lng += dlng;
        NSNumber *latitude = [[NSNumber alloc] initWithFloat:lat * 1e-5];
        NSNumber *longitude = [[NSNumber alloc] initWithFloat:lng * 1e-5];

        CLLocation *location = [[CLLocation alloc] initWithLatitude:[latitude floatValue] longitude:[longitude floatValue]];
        [array addObject:location];
    }

    return array;
}

现在我正尝试在 SWIFT 中实现此方法,但我在以下指令中遇到问题: NSInteger dlng = ((result & 1) ? ~(result >> 1) : (result >> 1));,我试过这样写:

var dlng: NSInteger = (result & 1) ? ~(结果 >> 1) : (结果 >> 1)

但是 Xcode 告诉我:Type 'Int' does not conform to protocol 'BooleanType'我不知道如何解决这个问题,有人可以帮我解决这个问题吗?

最佳答案

问题出在这里:

(result & 1)

在 Objective-C 中,整数可以用作 bool 表达式,其中 0 对应于 false,任何不同于零的值都是 true。在这种特定情况下,如果最右边的位为 1,则为真,否则为假。

在swift中,逻辑表达式必须是boolean类型,所以你需要做的就是将它转换成如下形式:

(result & 1) > 0

更新:由于在这种情况下您处理的是 NSInteger,它可以有正值和负值,也许最好从这个角度考虑,并使用“不同于零”而不是“大于零”:

(result & 1) != 0

关于ios - 在 SWIFT 中转换 ObjectiveC 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26484060/

相关文章:

ios - 就距离矩阵(距离和时间)而言,事实 API 与 Google Places API

ios - 给定电话号码,如何在 iOS 中调用电话?

iphone - iOS : Save image with custom resolution

ios - Google API Bug - 归因不一致

ios - Spritekit iOS 中的可玩区域

ios - 在 objective-c 泛型中,我可以将类型从一个类传递到另一个类吗

iOS Facebook API - 使用自定义/原生 UI 发布故事

适用于 armv7、armv7s、arm64 的 iOS 开源构建

ios - 检测 NSString 末尾的 4 个空格序列

swift - 如何使用 Swift 4.0 获取简短的本地日期/时间格式?