Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以编写一个Swift函数,只替换扩展的grapheme集群的一部分,如👩‍👩‍👧‍👧;?_Swift_String_Replace_Emoji_Unicode String - Fatal编程技术网

是否可以编写一个Swift函数,只替换扩展的grapheme集群的一部分,如👩‍👩‍👧‍👧;?

是否可以编写一个Swift函数,只替换扩展的grapheme集群的一部分,如👩‍👩‍👧‍👧;?,swift,string,replace,emoji,unicode-string,Swift,String,Replace,Emoji,Unicode String,我想写一个函数,可以这样使用: let Based on the insights gained at Why are emoji characters like 👩‍👩‍👧‍👦 treated so strangely in Swift strings?, a sensible approach might be to replace Unicode scalars: extension String { func re

我想写一个函数,可以这样使用:

let Based on the insights gained at Why are emoji characters like 👩‍👩‍👧‍👦 treated so strangely in Swift strings?, a sensible approach might be to replace Unicode scalars:

extension String {
    func replacingFirstOccurrence(of target: UnicodeScalar, with replacement: UnicodeScalar) -> String {

        let uc = self.unicodeScalars
        guard let idx = uc.index(of: target) else { return self }
        let prefix = uc[uc.startIndex..<idx]
        let suffix = uc[uc.index(after: idx) ..< uc.endIndex]
        return "\(prefix)\(replacement)\(suffix)"
    }
}

let基于在上获得的见解,一种明智的方法可能是替换Unicode标量:

let family1 = "Using the 
range(of:options:range:locale:)
the solution became quite concise:

extension String {
    func replaceFirstOccurrence(of searchString: String, with replacementString: String) -> String {
        guard let range = self.range(of: searchString, options: .literal) else { return self }
        return self.replacingCharacters(in: range, with: replacementString)
    }
}
扩展字符串{
func replacingFirstOccurrence(目标:UnicodeScalar,替换:UnicodeScalar)->字符串{
设uc=self.descalars
guard let idx=uc.index(of:target)else{return self}
让prefix=uc[uc.startIndex..使用该解决方案变得非常简洁:

首先在实例中查找
searchString
的范围,如果找到范围,则该范围将替换为
replacementString
。否则实例只返回自身。并且,由于
范围(of:)
方法一找到匹配项就返回,返回的范围保证是第一次出现

“221”。将第一次出现的(of:“2”,替换为:“3”)//321

“如果它需要处理所有表情符号(包括序列),同时保留不可见字符(零宽度连接符、变体选择器和所有其他特殊情况),那么这确实有点棘手。”.Martin但为什么要打印DescalarvView?在你申请替换后,你会看到相同的情况?@OleggordiChuk:我无意中打印了
family1
,而不是
family2
,谢谢你让我知道。这样如何让b=“@OlegordiChuk:这将替换所有事件,而不仅仅是第一次(如果它起作用的话)@Oleggordichuk:看看OP的前一个问题,这正是关于这个问题的。使用
.literal
选项,这确实很优雅,而且简单得多。
.literal
被记录为“精确的字符对字符等价”,但显然是“字符”在本文中,它并不表示Swift
字符
。我猜想它实际上意味着“精确的Unicode标量等价”或“精确的UTF-16等价”(因为
。literal
是在
NSString中定义的。CompareOptions
NSString
基于
unichar
)@MartinR我认为你是对的,但是因为你不能在Swift中使用格式错误的UTF-16进行搜索,它实际上意味着unicode标量等价。事实上,这没有什么区别。-也许关于
.literal
的信息会对你的另一个答案有帮助?这也通过了我所有的测试,在我的生活中感觉更自在图书馆,谢谢!