簡體   English   中英

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

[英]How can I add a method to NSString in Swift so that it sets the value of 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM