我正在实现一个简单的应用程序,它将从 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/