【问题标题】:Cannot convert value of type 'Range<String.Index>?' to specified type 'NSRange' (aka '_NSRange')无法转换 'Range<String.Index>?' 类型的值?到指定类型“NSRange”(又名“_NSRange”)
【发布时间】:2018-05-08 04:04:03
【问题描述】:

在从 Objective-C 到 Swift 代码更改期间,我遇到了错误。谢谢

func combinedName() -> String? {
        let range: NSRange = name.range(of: brand)
        if Int(range.length) > 0 {
            return name
        }
        return "\(brand) \(name)"
    } 

我的 Objective-C 代码

- (NSString *)combinedName {
    NSRange range = [self.name rangeOfString:self.brand];
    if (range.length > 0) return self.name;
    return [NSString stringWithFormat:@"%@ %@", self.brand, self.name];
}

【问题讨论】:

  • 基本上不注释编译器可以推断的类型。你让事情变得更糟了。

标签: ios swift swift4


【解决方案1】:

不要直接翻译 Objective-C 代码。使用普通的 Swift 结构从头开始编写 Swift 代码。

func combinedName() -> String {
    if name.range(of: brand) != nil {
        return name
    } else {
        return "\(brand) \(name)"
    }
}

假设namebrand 都不是可选的,则返回类型不应该是可选的,因为您在任何情况下都不会返回nil

您还可以使用?: 使代码更简单:

func combinedName() -> String {
    return name.range(of: brand) != nil ? name : "\(brand) \(name)"
}

【讨论】:

  • 或者,在这种情况下,只是if name.contains(brand)
  • @MartinR 好电话。虽然当我不想完全匹配时,我倾向于使用rangeoptionscontains 当然在这里更容易。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-01
  • 1970-01-01
  • 2014-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多