我正在实施一个简单的应用程序,它将从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'
我不知道如何解决这个问题,有人可以帮我解决这个问题吗?
答案 0 :(得分:1)
问题在于:
(result & 1)
在目标C中,整数可以用作布尔表达式,其中0对应于false,任何不同于零的值都为true。在这种特定情况下,如果最右边的位为1,则为true,否则为false。
在swift中,逻辑表达式必须是布尔类型,所以你需要做的就是按如下方式转换它:
(result & 1) > 0
更新:因为在这种情况下,您正在处理可能具有正值和负值的NSInteger
,也许最好用这个术语来思考,并使用&#34;不同于零&#34;而不是&#34;大于零&#34;:
(result & 1) != 0