如何在Swift中向NSString添加一个方法,以便它设置Self的值



我知道子类化NSString是一件坏事,但我想在Swift中向NSString添加方法,这样我就可以在存储字符串值之前根据特定规则对其进行消毒。

我想也许我可以做一些非常简单的事情(在这个例子中没有消毒——我现在只是在尝试:

import Foundation
extension String{
func setString(setter:String) {
self = setter
}
}

但这并不奏效——"自我"是不可变的。从文档来看,这对初始化程序是有效的,但我不一定想为所有字符串调用此代码。

我可以在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,因此我不能从目标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

最新更新