采用NSURL对象的有效方法如下:
foo://name/12345
并将其分解为一个字符串和一个无符号整数,其中字符串val为'name'且unsigned int为12345?
我假设算法涉及将NSURL转换为NSString,然后使用NSScanner的某些组件来完成剩下的工作?
答案 0 :(得分:188)
我只能在这里添加一个示例,NSURL类是要去的。这不完整,但会给你一个如何使用NSURL的提示:
NSString *url_ = @"foo://name.com:8080/12345;param?foo=1&baa=2#fragment";
NSURL *url = [NSURL URLWithString:url_];
NSLog(@"scheme: %@", [url scheme]);
NSLog(@"host: %@", [url host]);
NSLog(@"port: %@", [url port]);
NSLog(@"path: %@", [url path]);
NSLog(@"path components: %@", [url pathComponents]);
NSLog(@"parameterString: %@", [url parameterString]);
NSLog(@"query: %@", [url query]);
NSLog(@"fragment: %@", [url fragment]);
输出:
scheme: foo
host: name.com
port: 8080
path: /12345
path components: (
"/",
12345
)
parameterString: param
query: foo=1&baa=2
fragment: fragment
这个Q& A NSURL's parameterString confusion with use of ';' vs '&'对于网址也很有意思。
答案 1 :(得分:19)
NSURL有一个方法pathComponents
,它返回一个包含所有不同路径组件的数组。这应该可以帮助你获得整数部分。要获取名称,我将使用NSURL的host
方法。文档说,如果URL格式正确,它应该可以工作,也可以尝试一下。
总而言之,不需要转换为字符串,似乎有很多方法可以从NSURL对象本身计算出URL的组件。
答案 2 :(得分:10)
实际上有一种更好的解析NSURL的方法。使用NSURLComponents。这是一个简单的例子:
<强>夫特:强>
extension URL {
var params: [String: String]? {
if let urlComponents = URLComponents(url: self, resolvingAgainstBaseURL: true) {
if let queryItems = urlComponents.queryItems {
var params = [String: String]()
queryItems.forEach{
params[$0.name] = $0.value
}
return params
}
}
return nil
}
}
<强>目标-C:强>
NSURLComponents *components = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO];
NSArray *queryItems = [components queryItems];
NSMutableDictionary *dict = [NSMutableDictionary new];
for (NSURLQueryItem *item in queryItems)
{
[dict setObject:[item value] forKey:[item name]];
}
答案 3 :(得分:0)
感谢尼克指出我正确的方向。
我想比较文件网址但是遇到了额外的斜杠问题,使得isEqualString无用。您可以使用下面的示例来比较两个网址,方法是首先对它们进行解构,然后将这些网格相互比较。
- (BOOL) isURLMatch:(NSString*) url1 url2:(NSString*) url2
{
NSURL *u1 = [NSURL URLWithString:url1];
NSURL *u2 = [NSURL URLWithString:url2];
if (![[u1 scheme] isEqualToString:[u2 scheme]]) return NO;
if (![[u1 host] isEqualToString:[u2 host]]) return NO;
if (![[url1 pathComponents] isEqualToArray:[url2 pathComponents]]) return NO;
//check some properties if not nil as isEqualSting fails when comparing them
if ([u1 port] && [u2 port])
{
if (![[u1 port] isEqualToNumber:[u2 port]]) return NO;
}
if ([u1 query] && [u2 query])
{
if (![[u1 query] isEqualToString:[u2 query]]) return NO;
}
return YES;
}