首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Swift:清理声明/元编程

Swift:清理声明/元编程
EN

Stack Overflow用户
提问于 2015-04-03 00:52:55
回答 1查看 138关注 0票数 2

我有以下声明:

代码语言:javascript
复制
var loginServiceUsed: String? = NSUserDefaults.standardUserDefaults().stringForKey(Constants.loginServiceUsed.rawValue) {
    didSet {
        NSUserDefaults.standardUserDefaults().setObject(loginServiceUsed, forKey: Constants.loginServiceUsed.rawValue)
    }
}
var loginServiceToken: String? = NSUserDefaults.standardUserDefaults().stringForKey(Constants.loginServiceToken.rawValue) {
    didSet {
        NSUserDefaults.standardUserDefaults().setObject(loginServiceToken, forKey: Constants.loginServiceToken.rawValue)
    }
}
...

重复了大约六次。这么多相同的模式让我有点不舒服。如果我写的是ruby代码,我会在里面加入一些元编程,这将是一个变量名数组,以及相关的4-5行代码--我将减少到6行代码。

有什么好办法来清理这些声明吗?

我很乐意以这样的方式重构它,使每个声明都成为一个班轮--有什么方法可以用闭包来完成吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-05 21:49:40

到目前为止,我的解决方案还没有我想要的那么巧妙:

代码语言:javascript
复制
struct BackedVariable<type: AnyObject> {

    var key: String

    init(_ key: String) {
        self.key = key
    }

    var value: type? {
        set {
            NSUserDefaults.standardUserDefaults().setObject(newValue, forKey: key)
        }
        get {
            let returnValue = NSUserDefaults.standardUserDefaults().objectForKey(self.key) as? type
            return returnValue
        }
    }
}

var bv: BackedVariable = BackedVariable<NSString>("backed")
bv.value = "foo"
println("\(bv.value!)") // "foo"

所以

代码语言:javascript
复制
var loginServiceUsed: BackedVariable<String>("loginServiceUsed")
loginServiceUsed.value = "SomeValue"
doSomethingWith(loginServiceUsed.value)

这并不可怕,但这不是我所希望的。我不能重写=操作符来执行更自然的任务。我正在考虑增加一些其他的操作符,这样我就可以做到

代码语言:javascript
复制
loginServiceUser <operator assigns> newValue

它封装了重复的复杂性,所以这是好的,无论如何。

以后..。

我可以补充

代码语言:javascript
复制
postfix operator & { }
postfix operator &! { }

func &=<type: AnyObject>(inout oldValue:BackedVariable<type>, newValue: type?) -> BackedVariable<type> {
    oldValue.value = newValue
    return oldValue
}

postfix func &<type>(object: BackedVariable<type>) -> type? {
    return object.value
}

postfix func &!<type>(object: BackedVariable<type>) -> type {
    return (object&)!
}

然后再做

代码语言:javascript
复制
loginServiceUser &= "bar"
println("\(loginServiceUser.value!)") // "bar"
println("\((loginServiceUser&)!)") // "bar"
println("\(loginServiceUser&!)") // "bar"

我不相信这是一场大胜利。但它很可能是最棒的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29424773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档