Vous avez peut-être entendu dire que "utilisez string.isEmpty au lieu de string.count == 0 "lorsque vous voulez savoir si une chaîne est vide.
La raison en est que var count: Int in String est $ O (n) $, mais var is Empty: Bool est $ O (1) $ [^ String.isEmpty].
[^ String.isEmpty]: Référence: Pourquoi isEmpty est meilleur que count == 0
Alors, comment savoir si le «compte» d'une chaîne est égal à un nombre quelconque?
extension String {
func countIsEqual(to expectedCount: Int) -> Bool {
//Pensez ici
}
}
Le plus simple serait:
extension String {
func countIsEqual(to expectedCount: Int) -> Bool {
return self.count == expectedCount
}
}
let string = "Qiita"
print(string.countIsEqual(to: 1)) // -> false
print(string.countIsEqual(to: 5)) // -> true
print(string.countIsEqual(to: 10)) // -> false
mais attendez un instant. J'ai utilisé ʻis Empty pour vérifier si la chaîne était vide parce que countétait $ O (n) $. CecountIsEqual appelle en interne count`. Si «self» ne contient au plus que quelques caractères, c'est acceptable, mais si «self» peut contenir 10 millions de caractères, il ne peut pas être ignoré.
Considérez un moyen de ne pas appeler «count».
Si vous n'utilisez pas count, vous devez le compter vous-même. Mais si vous le comptez vous-même, vous pouvez arrêter de compter quand il dépasse le «nombre attendu».
Alors maintenant:
extension String {
func countIsEqual(to expectedCount: Int) -> Bool {
guard expectedCount >= 0 else { return false }
var countNow = 0
for _ in self {
countNow += 1
if countNow > expectedCount {
return false
}
}
return countNow == expectedCount
}
}
let string = "Qiita"
print(string.countIsEqual(to: 1)) // -> false
print(string.countIsEqual(to: 5)) // -> true
print(string.countIsEqual(to: 10)) // -> false
C’est facile, non?
Au fait, c'est aussi $ O (n) $, mais dans ce cas, $ n $ est "le plus petit de count et de ʻespected Count". Fondamentalement, si «count» et «attendu Count» ne changent pas beaucoup, la première implémentation simple peut être meilleure. Cependant, s'il y a une possibilité qu'une grande chaîne de caractères entre (intentionnellement ou non) en raison d'une entrée externe, par exemple, et que ʻexpectedCount devrait prendre une petite valeur, cliquez ici. La mise en œuvre de est plus utile.