代码之家  ›  专栏  ›  技术社区  ›  grative

我怎样才能掩盖Swift中的第一个和最后一个角色?

  •  0
  • grative  · 技术社区  · 2 年前

    我有一个扩展来屏蔽第一个和最后一个字符。当我试图屏蔽最后一个字符时,它会工作,但如果我试图屏蔽第一个字符,它不会像我想要的那样屏蔽。

    例如

    extension String {
        func maskedChar(_ charCount: Int, lastCharacters: Bool = true) -> String {
            if self.count <= charCount {
                return self
            }
            let mask = String(repeating: "*", count: charCount)
            return lastCharacters ? self.prefix(self.count - charCount) + mask : self.suffix(self.count - charCount) + mask
        }
    }
    
    let sample = "123456"
    print(sample.maskedChar(3))
    print(sample.maskedChar(3, lastCharacters: false))
    
    // 123***
    // 456***
    

    我想看到的基本上是***456。

    还有,有没有办法缩短代码?回程线太长,看不见。

    2 回复  |  直到 2 年前
        1
  •  0
  •   Duncan C    2 年前

    很简单,真的。在“not lastCharacters”的情况下,只需颠倒字符串和掩码中字符的顺序:

    extension String {
        func maskedChar(_ charCount: Int, lastCharacters: Bool = true) -> String {
            if self.count < charCount {
                return String(repeating: "*", count: self.count)
            }
            let mask = String(repeating: "*", count: charCount)
            if lastCharacters {
                return self.prefix(self.count - charCount) + mask
            } else {
                return mask + self.suffix(self.count - charCount)
            }
        }
    }
    

    注意,我在开头还更改了if子句。在我看来,你应该总是屏蔽数据,即使源字符串太短。

        2
  •  0
  •   Joakim Danielson    2 年前

    我会用 dropFirst/dropLast 连同 mask 你创造

    extension String {
        func maskedChar(_ charCount: Int, lastCharacters: Bool = true) -> String {
            if self.count <= charCount { return self }
    
            let mask = String(repeating: "*", count: charCount)
            return lastCharacters ? self.dropLast(charCount) + mask : mask + self.dropFirst(charCount)
        }
    }