И если вы хотите работать с объектом данных, эти два очень важны:
public class User implements Parcelable
NSURL имеет метод pathComponents
, который возвращает массив со всеми различными компонентами пути. Это должно помочь вам получить целую часть. Чтобы получить имя, я бы использовал метод host
для NSURL. Документы говорят, что он должен работать, если URL-адрес должным образом отформатирован, может также дать ему попробовать.
В общем, нет необходимости конвертировать в строку, похоже, есть много методов для разработки компонентов URL-адреса из самого объекта NSURL.
На самом деле есть лучший способ разобрать NSURL. Используйте NSURLComponents. Вот пример simle:
Swift:
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
}
}
Objective-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]];
}
Спасибо Нику за то, что указали мне в правильном направлении.
Я хотел сравнить URL-адреса файлов, но у меня были проблемы с дополнительными косыми чертами, делающими isEqualString бесполезным. Вы можете использовать мой пример ниже для сравнения двух URL-адресов, сначала деконструируя их, а затем сравнивая части друг с другом.
- (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;
}
Я могу только добавить пример здесь, класс 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]);
output:
scheme: foo
host: name.com
port: 8080
path: /12345
path components: (
"/",
12345
)
parameterString: param
query: foo=1&baa=2
fragment: fragment
Этот параметр Q & amp; A NSURL'sString с использованием of ';' vs '& amp;' также интересен в отношении URL-адресов.
pathComponents
является рискованным. Действительно, если ваши компоненты пути содержат /
, EVEN ENCODED, pathComponents будут декодировать его и считать его разделителем. Я бы лучше проанализировал компоненты пути.
– Aurelien Porte
23 January 2015 в 11:06