【问题标题】:warning: 'characters' is deprecated: Please use String or Substring directly警告:不推荐使用“字符”:请直接使用字符串或子字符串
【发布时间】:2018-03-10 02:05:56
【问题描述】:

characters - String 的实例属性,已弃用 Xcode 9.1

使用characters 属性从String 中获取子字符串非常有用,但现在它已被弃用,Xcode 建议使用substring。我试图检查 SO 问题和苹果开发人员教程/指南。但看不到任何建议的解决方案/替代方案。

这里是警告信息:

'characters' 已弃用:请使用字符串或子字符串

我已经使用属性characters 执行/处理了很多字符串操作。

有人对此更新有任何想法/信息吗?

【问题讨论】:

  • 这里是 interesting article 关于 String 从 Swift 3 到 4 的更改,另请阅读 SE0163
  • 尝试改用count
  • 如果你使用的是string.characters.forEach,那么新的API就是string.forEach { char in process(char) }

标签: ios string substring swift4 xcode9.1


【解决方案1】:

Swift 4 引入了对字符串 API 的更改。
您可以只使用!stringValue.isEmpty 而不是stringValue.characters.count > 0

有关更多信息,您可以从here获取样本

例如

let edit = "Summary"
edit.count   // 7

【讨论】:

  • 感谢您的回答.. 但是我可以有子字符串的详细参考。这只是示例示例,我还有很多其他处理字符的操作
  • let greeting = "Hello, world!"让 index = greeting.index(of: ",") ?? greeting.endIndex 让开始 = greeting[..
  • Substring 的在线参考。
  • 永远不要使用 count > 0 来检查集合是否为空。 Collection 上有一个名为 isEmpty 的属性正是为此。从文档 当您需要检查您的集合是否为空时,请使用 isEmpty 属性而不是检查 count 属性是否等于零。对于不符合 RandomAccessCollection 的集合,访问 count 属性会遍历集合的元素。
【解决方案2】:

Swift 4 与 Swift 3 示例:

let myString = "test"

for char in myString.characters {print(char) } // Swift 3
for char in myString { print(char) } // Swift 4

let length = myString.characters.count // Swift 3
let length = myString.count // Swift 4

【讨论】:

  • 这应该是公认的答案。问题是关于 string.characters.count 的替换,而不是与零比较的替换;仅在屏幕截图中提及。
【解决方案3】:

处理字符串的最常见情况之一是使用 JSON 响应。在此示例中,我在手表应用程序中创建了一个扩展,以删除比特币 JSON 对象的最后 (n) 个字符。

斯威夫特 3:

func dropLast(_ n: Int = 0) -> String {
    return String(characters.dropLast(n))

Xcode 9.1 错误信息:

'characters' 已弃用:请直接使用字符串或子字符串

Xcode 告诉我们直接使用字符串变量或方法。

斯威夫特 4:

func dropLast(_ n: Int = 0) -> String {
    return String(dropLast(n))
    }

完整的扩展:

extension String {
    func dropLast(_ n: Int = 0) -> String {
        return String(dropLast(n))
    }

    var dropLast: String {
        return dropLast()
    }
}

致电:

print("rate:\(response.USDRate)")
let literalMarketPrice = response.USDRate.dropLast(2)
print("literal market price: \(literalMarketPrice)")

控制台:

//rate:7,101.0888 //JSON float
//literal market price: 7,101.08 // JSON string literal

其他示例:

  • print("Spell has \(invisibleSpellName.count) characters.")
  • return String(dropLast(n))
  • return String(removeLast(n))

文档:

您经常会使用常用方法,例如 dropLast()removeLast()count,因此这里是每种方法的明确 Apple 文档。

droplast()

removelast()

counting characters

【讨论】:

    【解决方案4】:

    使用这个characters,因为String 在 Swift 2.0 中不再是一个集合。然而,这在 Swift 4 中仍然是有效的代码,但现在不再需要 String 再次成为 Collection

    例如,Swift 4 String 现在有一个直接计数属性,可以提供字符计数:

    // Swift 4
    let spString = "Stack"
    spString.count           // 5
    

    字符串和子字符串的示例。

    字符串

    Swift 4 String 现在直接获取给出字符串第一个字符的元素:(string.characters.first)

    let spString = "Stack"
    let firstElement = spString.first   //S
    

    子字符串

    使用 SubString 获取第一个字符。

    let spstring = "Welcome"
    let indexStartOfText = spstring.index(spstring.startIndex, offsetBy: 1)
    let sub = spstring.substring(to: indexStartOfText)
    print(sub) //W
    

    【讨论】:

    • 我想获取字符串的第一个字符,所以我想知道我应该使用哪种方式 let firstElement = spString.first 或 Substring?
    • @Pulkit 最好使用.first,因为如果字符串为"" 为空。它只会返回 nil 但substring 会产生错误。
    • 如何将这行代码转换为swift 4 'AuthorImageText = String(val.characters[(AuthorName.startIndex)]).capitalized'
    • @Pulkit 只需删除 .characters 就够了
    【解决方案5】:

    该警告只是冰山一角,字符串发生了很多变化,字符串又是字符的集合,但我们得到了一些新的和酷的东西,subStrings :)

    这是一篇很棒的文章: https://useyourloaf.com/blog/updating-strings-for-swift-4/

    【讨论】:

      【解决方案6】:

      只需删除字符 例如:

      stringValue.characters.count 到 stringValue.count

      【讨论】:

        【解决方案7】:

        您也可以使用此代码进行字典分组,而无需使用 { $0.characters.first! }。

        let cities = ["Shanghai": 24_256_800, "Karachi": 23_500_000, "Beijing": 21_516_000, "Seoul": 9_995_000]
        let groupedCities = Dictionary(grouping: cities.keys) { $0.first! }
        print(groupedCities)
        

        【讨论】:

          【解决方案8】:
          func validatePhoneNumber(number:String) -> Bool{
              if number.count < 10. //deprecated ->(number.characters.count)
              {
                  return false;
              }else{
                  return true;
              }
          }
          

          您直接使用 .count 并且不推荐使用字符。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-09-30
            • 2014-04-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-11-03
            相关资源
            最近更新 更多