在SWIFT中转换ObjectiveC表达式

时间:2014-10-21 10:06:20

标签: ios objective-c swift

我正在实施一个简单的应用程序,它将从Google地图下载数据,我将在地图上显示这些数据。我实现了所有代码以从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) ? ~(result >> 1) : (result >> 1)

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

1 个答案:

答案 0 :(得分:1)

问题在于:

(result & 1)

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

在swift中,逻辑表达式必须是布尔类型,所以你需要做的就是按如下方式转换它:

(result & 1) > 0

更新:因为在这种情况下,您正在处理可能具有正值和负值的NSInteger,也许最好用这个术语来思考,并使用&#34;不同于零&#34;而不是&#34;大于零&#34;:

(result & 1) != 0