【问题标题】:Translate rangeOfString from Objective-c To Swift将 rangeOfString 从 Objective-c 转换为 Swift
【发布时间】:2015-06-23 18:44:44
【问题描述】:

我花了好几个小时来翻译这个短代码。 目标 C:

NSString *urlStr = [request.URL absoluteString];
NSArray *urlParts = [urlStr componentsSeparatedByString:[NSString stringWithFormat:@"%@/", kREDIRECTURI]];

if (urlParts.count > 1)
{
    urlStr = urlParts[1];
    NSRange token = [urlStr rangeOfString:@"#access_token="];

    if (token.location != NSNotFound)
    {
        vc.access_token = [urlStr substringFromIndex:NSMaxRange(token)];
    }
}

我尝试过的:

斯威夫特:

var urlParts : NSArray = urlStr!.componentsSeparatedByString("\(kREDIRECTURI)")
if urlParts.count > 1
{
    urlStr = urlParts[1] as? String
    var token  = urlStr!.rangeOfString("#access_token=", options: NSStringCompareOptions.allZeros) as NSRange!

    if token != nil
    {
         var vc = ViewController()
         urlStr!.substringFromIndex(NSMaxRange(token))!
    }
}

有什么想法吗?

【问题讨论】:

  • 什么不起作用?一点是您没有在 swift 代码中设置 vc.access_token。
  • @Bijington 我刚刚删除了该行,因为我知道如何翻译其余部分,哈哈,我只是想显示更少的代码。我无法解决的行是: NSArray *urlParts = [urlStr componentsSeparatedByString:[NSString stringWithFormat:@"%@/", kREDIRECTURI]];和
  • @Bijington vc.access_token = [urlStr substringFromIndex:NSMaxRange(token)];
  • 您不能在这一行中将 Range 转换为 NSRange。 var token = urlStr!.rangeOfString("#access_token=", options: NSStringCompareOptions.allZeros) as NSRange!
  • @EpicByte 是的,我知道,我正在努力寻找正确的方法。

标签: ios objective-c swift nsrange


【解决方案1】:

我将假设 access_token 查询参数位于末尾,并且代码遵循这样的字符串 'http:\...#access_token=',url 以末尾的代码结尾。这是一个从url中提取代码的简单方法,

func getTokenFromUrl(url: String) -> String? {

    let range1 = url.rangeOfString("#access_token")

    guard let range = range1 else { return nil }

    let startIndex = range.endIndex.successor()
    let rangeOfToken = url.endIndex

    let rangeOfString = startIndex ..< rangeOfToken

   return  url.substringWithRange(rangeOfString)
}

let url1 = "http://stackoverflow.com/questions/31010975/translate-rangeofstring-from-objective-c-to-swift?#access_token=873jasf82jmsa8sd"

let url2 = "http://stackoverflow.com/questions/31010975/translate-rangeofstring-from-objective-c-to-swift"

getTokenFromUrl(url1) // returns 873jasf82jmsa8sd
getTokenFromUrl(url2) // returns nil

对于早期版本的 Swift,你可以使用 if let 模式来解包可选,

func getTokenFromUrl(url: String) -> String? {

    let range1 = url.rangeOfString("#access_token")

    if let range = range1 {

        let startIndex = range.endIndex.successor()
        let rangeOfToken = url.endIndex

        let rangeOfString = startIndex ..< rangeOfToken

       return  url.substringWithRange(rangeOfString)
    }
    return nil
}

【讨论】:

  • @roimulia 请查看我的更改。
  • return url1.substringWithRange(rangeOfString) url1 是否假设为 url? :D
  • 确实如此!更正:)
  • 似乎工作! :) 如果您可以请提供我一个 asnwer,如果我使用此方法而不是 Objective C 方法,我应该如何安排来自 OP 的代码?
  • 我不明白。你的意思是你想用Objective C编写它并从Swift调用那个方法。
猜你喜欢
  • 1970-01-01
  • 2018-04-08
  • 2016-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多