警告:不建议使用“字符”:请直接使用字符串或子字符串


162

字符-Xcode 9.1不推荐使用String的实例属性

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

这是警告消息:

不推荐使用“字符”:请使用字符串或子字符串

在此处输入图片说明

我有很多使用property执行/处理的字符串操作characters

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


5
这是一篇有关String从Swift 3到4 的更改的有趣文章,还请阅读SE0163
vadian

5
尝试改为使用count
Holex

1
如果您使用的string.characters.forEach是新API,则是string.forEach { char in process(char) }
Efren

Answers:


270

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

有关更多信息,请从此处获取示例

例如

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

感谢您的答复。但是我可以详细参考子字符串吗?这只是示例,我还有很多其他处理字符的操作
Krunal


让问候=“你好,世界!” 让索引= greeting.index(of:“,”)?? greeting.endIndex让开始= greeting [.. <index]
songxunzhao

1
Substring的在线参考。
丹尼斯·文宁克

32
切勿使用count> 0来检查集合是否为空。为此,Collection上有一个名为isEmpty的属性。来自文档的文档当您需要检查集合是否为空时,请使用isEmpty属性,而不要检查count属性是否等于零。对于不符合RandomAccessCollection的集合,访问count属性将遍历集合的元素。
Leo Dabus

82

Swift 4 vs 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

2
这应该是公认的答案。问题是替换string.characters.count,而不是替换为零。仅在屏幕截图中提及。
蒂莫西·坎斯基

9

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

斯威夫特3:

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

Xcode 9.1错误消息:

不推荐使用“字符”:请直接使用字符串或子字符串

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()

数字符



2

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

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

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

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

Swift 4 String现在直接获取给出String的第一个字符的Element:(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

1
@Pulkit最好使用,.first因为如果string为""空。它只会返回nil,但substring会产生错误。
Pranavan Sp

如何这行代码转换,以迅速4 'AuthorImageText =字符串(val.characters [(AuthorName.startIndex)])大写。'
Pulkit

@Pulkit只需移除.characters足够
Pranavan Sp '18

0

您也可以将此代码用于字典分组,而无需使用{$ 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)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.