Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 敏捷的替换变量';s值使用扩展函数_Swift - Fatal编程技术网

Swift 敏捷的替换变量';s值使用扩展函数

Swift 敏捷的替换变量';s值使用扩展函数,swift,Swift,我想创建一个函数来更改变量的原始值。比如说 class Something { var name:String = " John Diggle " name.trim() print(name) // prints out " John Diggle " // what I wanna do is to make it so that I don't do this name = name.trim() print(nam

我想创建一个函数来更改变量的原始值。比如说

class Something {
    var name:String = "   John Diggle   "
    name.trim()
    print(name)
    // prints out "   John Diggle   "

    // what I wanna do is to make it so that I don't do this
    name = name.trim()
    print(name)
    // prints out "John Diggle"
}




extension String {
   func trim() -> String{
       return self.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
   }
}

有没有一种方法可以在不执行
name=name.trim()
的情况下更改函数中变量的值?

可能是这样的

extension String {
    mutating func trim() {
        self = self.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)
    }
}

然后您可以将其用作
name.trim()
每次更改字符串时,您可以使用
didSet
来修剪字符串:

class Something {
    var name: String = "" {
        didSet {
            name = name.trimmingCharacters(in: .whitespacesAndNewlines)
        }
    }
}

let s = Something()
s.name = "   John Diggle     "

// Note that we never call trim in the outside code
print("'\(s.name)'")

为了扩展Tj3n的答案(您应该接受),API中出现的惯例是使用动词的过去时(例如
trim
)返回一个新字符串,该方法可用于常量和变量,并使用现在时(例如
trim
)进行变体,只能用于变量:

extension String {

    func trimmed() -> String {
        return self.stringByTrimmingCharactersInSet(.whitespaceAndNewlineCharacterSet())
    }

    mutating func trim() {
        self = self.trimmed()
    }

}
因此,要么:

var name = "   John Diggle   "
name.trim()
print("'\(name)'")
或:


假设:
mutating
属性让编译器知道不能对常量调用函数?是的,它应该是
var
,因为String是一个结构而不是类,一旦让它改变值,它就不能改变值,但问题是,它应该已经是
var
mutating
关键字表示您试图更改函数内部的
self
值。我不知道我可以在字符串扩展上使用mutating func。谢谢,我不知道为什么这被否决了。这是一个不错的解决方案。@n也许是因为它不是一个扩展?(根据要求)这取决于OP未明确说明的假设。从名称的开头和结尾修剪空格是合理的期望。OP要求在单个函数调用中改变
名称
(而不是重新分配),但最终目标可能是identical@CodeDifferent标题很清楚地要求extension@NRitH-我认为这不值得投反对票,但这也不是一个好模式。当你设置一个属性时,你希望它是你设置的任何东西。在这种特殊情况下,这可能不是问题,但作为一般模式,这种隐藏的行为会成为维护的麻烦。如果我想要这种行为,我会(a)使用私有存储财产;(b) 具有更新值的公共方法;和(c)具有用于检索值的计算属性。但是这个公共接口应该使用一些名称,以清楚地表明可能已经发生了一些转换。谢谢,到目前为止,我将在命名约定中记住这一点
let name = "   John Diggle   "
let trimmedName = name.trimmed()
print("'\(trimmedName)'")