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)'")