String.hasPrefix (o [NSString hasPrefix] ) siempre fue parte de Foundation . Sin embargo, acabo de darme cuenta de que ahora también tenemos starts(with:) .
Este método proviene de Sequence pero también funciona para String .
Mi pregunta es, ¿cuál debo preferir? ¿Hay alguna consideración de rendimiento? Estoy acostumbrado a hasPrefix desde los días de Objective-C, pero starts(with:) es más intuitivo y funciona para otras secuencias.
String.hasPrefix() se implementa en StringLegacy.swift como
extension String { public func hasPrefix(_ prefix: String) -> Bool { if _fastPath(self._guts.isNFCFastUTF8 && prefix._guts.isNFCFastUTF8) { guard prefix._guts.count <= self._guts.count else { return false } return prefix._guts.withFastUTF8 { nfcPrefix in let prefixEnd = nfcPrefix.count return self._guts.withFastUTF8(range: 0..<prefixEnd) { nfcSlicedSelf in return _binaryCompare(nfcSlicedSelf, nfcPrefix) == 0 } } } return starts(with: prefix) } } lo que significa (si lo entiendo correctamente): si tanto la cadena como el prefijo candidato usan un almacenamiento basado en UTF-8, entonces los bytes UTF-8 se comparan directamente. De lo contrario, vuelve a starts(with:) y realiza una comparación basada en Character .
Por lo tanto, no hay diferencia en el resultado, pero hasPrefix() está optimizado para cadenas Swift nativas.
Nota: Esta es la rama principal (Swift 5), la situación puede ser diferente en versiones anteriores.