问题描述
我知道子类化 Nsstring 是一件坏事,但我想在 Swift 中向 Nsstring 添加方法,以便我可以在存储其值之前根据特定规则清理字符串。
我想也许我可以做一些像这样非常简单的事情(在这个例子中没有消毒 - 我现在只是在尝试:
import Foundation
extension String{
func setString(setter:String) {
self = setter
}
}
但这不起作用 - 'self' 是不可变的。从查看文档来看,这对于初始化程序是有效的 - 但我不一定要为所有字符串调用此代码。
我可以找到绕过 ObjC 的方法 - 但我参加 Swift 的派对很时髦。有什么建议吗?
更新
所以这是我正在尝试做的更准确的表示(感谢迄今为止提供帮助的每个人)
import Foundation
@objc extension Nsstring {
func sanitizedFilename() -> String {
let invalidCharacters = CharacterSet(charactersIn: "\\/:*?\"<>|")
.union(.newlines)
.union(.illegalCharacters)
.union(.controlCharacters)
return self.components(separatedBy: invalidCharacters).joined(separator: "")
}
func sanitizedString() -> String {
var invalidCharacters = CharacterSet().union(.illegalCharacters).union(.controlCharacters)
invalidCharacters.remove("\n")
invalidCharacters.remove("\t")
return self.components(separatedBy: invalidCharacters).joined(separator: "")
}
mutating func sanitizefilename() {
self = self.sanitizedFilename() as Nsstring
}
mutating func sanitizeString() {
self = self.sanitizedString() as Nsstring
}
}
如果我删除 Nsstring 的东西 - 将它保留为 String 然后它会构建,但我不能有 @objc,因此我不能从 Objective C 使用它。如果我把 Nsstring 的东西放进去,那么 self 是不可变的。
我有一种感觉,对于那些真正知道自己在做什么的人来说,这是一个非常简单的解决方法,我可能应该把头埋在水桶里。
解决方法
这里有一些东西可以帮助您理解这一点。
import Foundation
extension String {
// returns a new sanitized value (doesn't change anything in caller)
func sanitized() -> String {
return self.replacingOccurrences(of: "(",with: "")
.replacingOccurrences(of: ")",with: "")
}
// Sanitizes self (changes the value of caller)
// mutating is necessary when you need to modify self
mutating func sanitize() {
self = self.sanitized()
}
}
示例用法
let test1 = "(Test)"
let output1 = test1.sanitized() // receive a new value
print(output1) // Test
var test2 = "(Test)"
test2.sanitize() // modify the caller,it has to be var (not let)
print(test2) // Test