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

问题描述

我知道子类化 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