如何将 CLLCoordinate2D lat/long 转换为 NSNumber
How to convert CLLCoordinate2D lat/long into NSNumber
我正在尝试使用 Yelp API,并且我正在尝试将 lat/long 作为 API 搜索的参数。但是,它不接受 double
类型,它只接受 Objective-C 个对象。不了解 Objective-C,您建议 lat 和 long 的参数类型是什么?我尝试了 NSNumber,但是当我尝试将类型 CLLocationCoordinate2D
的 lat/long 坐标转换为一个接受双精度值的 NSNumber 时,它的值为 nil
这是我正在使用的 Yelp API:
- (void)queryTopBusinessInfoForTerm:(NSString *)term location:(NSString *)location latitude:(NSNumber *)latitude longitude:(NSNumber *)longitude completionHandler:(void (^)(NSDictionary *topBusinessJSON, NSError *error))completionHandler {
NSLog(@"Querying the Search API with term \'%@\' and location \'%@'", term, location);
//Make a first request to get the search results with the passed term and location
NSURLRequest *searchRequest = [self _searchRequestWithTerm:term location:location latitude:latitude longitude:longitude];
NSURLSession *session = [NSURLSession sharedSession];
[[session dataTaskWithRequest:searchRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
if (!error && httpResponse.statusCode == 200) {
NSDictionary *searchResponseJSON = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
NSArray *businessArray = searchResponseJSON[@"businesses"];
if ([businessArray count] > 0) {
NSDictionary *firstBusiness = [businessArray firstObject];
NSString *firstBusinessID = firstBusiness[@"id"];
NSLog(@"%lu businesses found, querying business info for the top result: %@", (unsigned long)[businessArray count], firstBusinessID);
[self queryBusinessInfoForBusinessId:firstBusinessID completionHandler:completionHandler];
} else {
completionHandler(nil, error); // No business was found
}
} else {
completionHandler(nil, error); // An error happened or the HTTP response is not a 200 OK
}
}] resume];
}
这是参数
- (NSURLRequest *)_searchRequestWithTerm:(NSString *)term location:(NSString *)location latitude:(NSNumber *) latitude longitude:(NSNumber *)longitude {
NSDictionary *params = @{
@"term": term,
@"location": location,
@"cll": latitude,
@"cll": longitude,
@"limit": kSearchLimit
};
return [NSURLRequest requestWithHost:kAPIHost path:kSearchPath params:params];
}
这是我当前的 Swift 从 YelpAPI 调用查询的方法:
func yelpApi() {
var latitude = NSNumber(double: businessStreetAddress.latitude)
var longitude = NSNumber(double: businessStreetAddress.longitude)
var searchTerm: NSString = "Asian Food";
var defaultLocation: NSString = "New York"
var APISample:YPAPISample = YPAPISample();
var requestGroup:dispatch_group_t = dispatch_group_create();
APISample.queryTopBusinessInfoForTerm(searchTerm as String, location: defaultLocation as String, latitude: latitude, longitude: longitude) { (topBusinessJSON: [NSObject: AnyObject]!, error: NSError!) -> Void in
if((error) != nil) {
println("Error happened during the request" + error.localizedDescription);
} else if((topBusinessJSON) != nil) {
println("Top business info",topBusinessJSON);
} else {
println("No business was found");
}
dispatch_group_leave(requestGroup);
}
dispatch_group_wait(requestGroup, DISPATCH_TIME_FOREVER);
}
要将 CLLocationCoordinate2D
转换为 NSNumber
,您不能在单个 NSNumber
中使用它。您可以转换为两个 NSNumber
对象,如下所示:
CLLocationCoordinate2D location; // This is the location you have.
NSNumber *latitude = [NSNumber numberWithDouble:location.latitude];
NSNumber *longitude = [NSNumber numberWithDouble:location.longitude];
使用 Modern ObjC,您可以转换为:
CLLocationCoordinate2D location; // This is the location you have.
NSNumber *latitude = @(location.latitude);
NSNumber *longitude = @(location.longitude);
然后打电话给你的
NSURLRequest *searchRequest = [self _searchRequestWithTerm:term location:location latitude:latitude longitude:longitude];
不要与我刚刚命名的 location
之类的变量混淆。因为您的函数 searchRequestWithTerm:location:latitude:longitude:
有一个名为 location
的参数,它接受 NSString
.
这可能对您有所帮助。
我正在尝试使用 Yelp API,并且我正在尝试将 lat/long 作为 API 搜索的参数。但是,它不接受 double
类型,它只接受 Objective-C 个对象。不了解 Objective-C,您建议 lat 和 long 的参数类型是什么?我尝试了 NSNumber,但是当我尝试将类型 CLLocationCoordinate2D
的 lat/long 坐标转换为一个接受双精度值的 NSNumber 时,它的值为 nil
这是我正在使用的 Yelp API:
- (void)queryTopBusinessInfoForTerm:(NSString *)term location:(NSString *)location latitude:(NSNumber *)latitude longitude:(NSNumber *)longitude completionHandler:(void (^)(NSDictionary *topBusinessJSON, NSError *error))completionHandler {
NSLog(@"Querying the Search API with term \'%@\' and location \'%@'", term, location);
//Make a first request to get the search results with the passed term and location
NSURLRequest *searchRequest = [self _searchRequestWithTerm:term location:location latitude:latitude longitude:longitude];
NSURLSession *session = [NSURLSession sharedSession];
[[session dataTaskWithRequest:searchRequest completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
if (!error && httpResponse.statusCode == 200) {
NSDictionary *searchResponseJSON = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
NSArray *businessArray = searchResponseJSON[@"businesses"];
if ([businessArray count] > 0) {
NSDictionary *firstBusiness = [businessArray firstObject];
NSString *firstBusinessID = firstBusiness[@"id"];
NSLog(@"%lu businesses found, querying business info for the top result: %@", (unsigned long)[businessArray count], firstBusinessID);
[self queryBusinessInfoForBusinessId:firstBusinessID completionHandler:completionHandler];
} else {
completionHandler(nil, error); // No business was found
}
} else {
completionHandler(nil, error); // An error happened or the HTTP response is not a 200 OK
}
}] resume];
}
这是参数
- (NSURLRequest *)_searchRequestWithTerm:(NSString *)term location:(NSString *)location latitude:(NSNumber *) latitude longitude:(NSNumber *)longitude {
NSDictionary *params = @{
@"term": term,
@"location": location,
@"cll": latitude,
@"cll": longitude,
@"limit": kSearchLimit
};
return [NSURLRequest requestWithHost:kAPIHost path:kSearchPath params:params];
}
这是我当前的 Swift 从 YelpAPI 调用查询的方法:
func yelpApi() {
var latitude = NSNumber(double: businessStreetAddress.latitude)
var longitude = NSNumber(double: businessStreetAddress.longitude)
var searchTerm: NSString = "Asian Food";
var defaultLocation: NSString = "New York"
var APISample:YPAPISample = YPAPISample();
var requestGroup:dispatch_group_t = dispatch_group_create();
APISample.queryTopBusinessInfoForTerm(searchTerm as String, location: defaultLocation as String, latitude: latitude, longitude: longitude) { (topBusinessJSON: [NSObject: AnyObject]!, error: NSError!) -> Void in
if((error) != nil) {
println("Error happened during the request" + error.localizedDescription);
} else if((topBusinessJSON) != nil) {
println("Top business info",topBusinessJSON);
} else {
println("No business was found");
}
dispatch_group_leave(requestGroup);
}
dispatch_group_wait(requestGroup, DISPATCH_TIME_FOREVER);
}
要将 CLLocationCoordinate2D
转换为 NSNumber
,您不能在单个 NSNumber
中使用它。您可以转换为两个 NSNumber
对象,如下所示:
CLLocationCoordinate2D location; // This is the location you have.
NSNumber *latitude = [NSNumber numberWithDouble:location.latitude];
NSNumber *longitude = [NSNumber numberWithDouble:location.longitude];
使用 Modern ObjC,您可以转换为:
CLLocationCoordinate2D location; // This is the location you have.
NSNumber *latitude = @(location.latitude);
NSNumber *longitude = @(location.longitude);
然后打电话给你的
NSURLRequest *searchRequest = [self _searchRequestWithTerm:term location:location latitude:latitude longitude:longitude];
不要与我刚刚命名的 location
之类的变量混淆。因为您的函数 searchRequestWithTerm:location:latitude:longitude:
有一个名为 location
的参数,它接受 NSString
.
这可能对您有所帮助。