Ответ 1
Если вы заботитесь только о двусмысленном сальнике, вы можете быстро отказаться от этого вопроса, зная, что путь NSURL обрезает конечную косую черту.
Но мне нравится идея метода категории на NSURL, который реализует некоторую эквивалентность на основе стандартов ( "эквивалентность", вероятно, является лучшим термином, чем равенство в этом случае).
@RobNapier ссылается на соответствующий вопрос с хорошим ответом, который указывает на RFC2616. Другим важным стандартом синтаксиса url является RFC1808.
Жесткая часть решает, что мы подразумеваем под эквивалентностью, например, что касается разных запросов или фрагментов (якорных ссылок)? Код ниже errs на стороне вседозволенности для большинства этих двусмысленностей...
// in NSURL+uriEquivalence.m
- (BOOL)isEquivalent:(NSURL *)aURL {
if ([self isEqual:aURL]) return YES;
if ([[self scheme] caseInsensitiveCompare:[aURL scheme]] != NSOrderedSame) return NO;
if ([[self host] caseInsensitiveCompare:[aURL host]] != NSOrderedSame) return NO;
// NSURL path is smart about trimming trailing slashes
// note case-sensitivty here
if ([[self path] compare:[aURL path]] != NSOrderedSame) return NO;
// at this point, we've established that the urls are equivalent according to the rfc
// insofar as scheme, host, and paths match
// according to rfc2616, port can weakly match if one is missing and the
// other is default for the scheme, but for now, let insist on an explicit match
if ([self port] || [aURL port]) {
if (![[self port] isEqual:[aURL port]]) return NO;
if (![[self query] isEqual:[aURL query]]) return NO;
}
// for things like user/pw, fragment, etc., seems sensible to be
// permissive about these.
return YES;
}