2013-06-21 111 views
0

序言:我正在编写一些我没有写的代码,而且我几乎不知道iOS的知识。检查一个字符串是否与数组中的任何值匹配?

该应用程序具有处理大部分应用程序的webview;内部链接加载到网页视图中,其他网站的链接在Safari中打开。但是,嵌入谷歌地图也会导致Safari浏览器打开。我找到了相关负责人的代码,我想,它看起来像这样:

// a bit higher up 
static NSString *const siteURL = @"http://my.example.com" 


if (![request.URL.absoluteString hasPrefix:siteUrl]) 
{ 
    if ([[UIApplication sharedApplication] canOpenURL:request.URL]) 
    { 
     [[UIApplication sharedApplication] openURL:request.URL]; 
    } 
    return NO; 
} 

现在因为“maps.google.com”不以“my.example.com”它从农场到野生动物园 - 这对我来说很有意义。但是,我试着修改这个:

static NSString *const googleMaps = @"http://maps.google.com" 

if (! ([request.URL.absoluteString hasPrefix:siteUrl] || [request.URL.absoluteString hasPrefix:googleMaps])) 
{ 
    if ([[UIApplication sharedApplication] canOpenURL:request.URL]) 
    { 
     [[UIApplication sharedApplication] openURL:request.URL]; 
    } 
    return NO; 
} 

这也适用。但我需要添加更多网址。我唯一的选择是不断添加'或'和字符串常量吗?或者有没有办法制作一个数组,并说“如果它匹配任何这些”?对不起,如果这个问题看起来简单。

在PHP中我只是做一些像in_array('string', $array)为我的病情,我想我在寻找如何做到这一点iOS中

+0

唯一字符串的列表,或只是为了查看它是否存在并将其添加到一个?对不起,我现在正在半读这个......这两个都已经有答案了,我会告诉你正确的方向 –

回答

2

一个解决办法是保持对象的NSSet,是所有字符串你想在你的内部网页视图中处理。

NSSet *internalURLSet = [NSSet setWithObjects:@"http://my.example.com", @"http://maps.google.com", nil]; 

使用一个可变集,如果你将被添加到设定一段时间,但你可能会知道你想在公司内部,只要你的应用程序启动处理哪些URL,这将不会改变。如果您在应用程序运行时添加集合,然后将它们添加到可变集合,因为它们变得已知。

当您检查URL时,使用[internalURLSet containsObject:urlToTest],它将匹配您添加到该集合的任何字符串。

检查设置是非常有效的。向对象添加对象并不那么简单,但是当您检查很多次时,您很可能仅向该设置添加一次URL。

(做indexOfObject:对一个NSArray的效率是非常低...)

-1

你可以通过创建URL的一个NSArray,然后使用indexOfObjectPassingTest:方法来测试你对每一个阵列中的URL做到这一点。它会是这样的:

NSArray *testURLs = @[ @"http://maps.google.com", @"http://www.example.com" ]; 

NSString *urlString = request.URL.absoluteString; 
BOOL urlMatchedTest = NO; 
for (NSString *testURL in testURLs) { 
    if [urlString hasPrefix:testURL]) { 
     urlMatchedTest = YES; 
    } 
} 
if (urlMatchedTest){ 
    // the url contains one of the test URLS 
} else { 
    // it didn't match any of the test URLs 
} 
+0

这是NSSet的用途。 – Idles

0

你可以尝试使用谓词。下面是用一个例子教程链接(年纪大了,但仍应工作):

http://arstechnica.com/apple/2009/04/cocoa-dev-the-joy-of-nspredicates-and-matching-strings/

我做了很多.NET开发的太和永远怀念LINQ当我回去的iOS。谓词可以帮助更多的代码行,但是可以进行各种搜索。

+1

答案与代码=很好的答案。只有链接的答案=链接中断时的错误答案。 http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers – iwasrobbed

+0

但是,寻求答案而不是依靠论坛的鼓励是+1。 ..对不起,2个邪恶和一个学生不会搜索谷歌,因为他“太善于沟通”被理解影响这个评论 –

0

我看到你的问题。在IOS中,没有函数in_array('string',$ array)来检查数组中是否包含字符串。 我有一个建议:你创建一个包含所有URL的数组。并执行'for'或'while'循环来获取数组的值来检查它。如果相同,则调用函数OpenUrl。

相关问题