Swift - Switch语句无法正常工作

4

我希望在NSUserDefaults中存储UIColor。然而,这会导致一些问题,因此我想我可以将UIColor保存为字符串,以便再次转换为UIColor。

我决定使用switch语句来实现:

switch bc {
    case "UIColor.redColor()":
        blockColour = UIColor.redColor()
    case "UIColor.orangeColor()":
        blockColour = UIColor.orangeColor()
    case "UIColor.blueColor()":
        blockColour = UIColor.blueColor()
    case "UIColor.greenColor()":
        blockColour = UIColor.greenColor()
    case "UIColor.blackColor()":
        blockColour = UIColor.blackColor()
    case "UIColor.grayColor()":
        blockColour = UIColor.grayColor()
    case "UIColor.purpleColor()":
        blockColour = UIColor.purpleColor()
    default:
        println("ERROR!")
    }

然而,每个case语句都报错,错误信息如下:
Type 'String' does not conform to protocol 'IntervalType'

我相信这不是最有效的方法或最简单的方法,但这是我能想到的唯一保存UIColor在NSUserDefaults中的方法。
问题是什么?
编辑:前面的代码显示了bc如何定义:
var bc : String!
var blockColour : UIColor!

var userDefaults = NSUserDefaults.standardUserDefaults()

    if var blockColourString : AnyObject = userDefaults.valueForKey("blockColour") {
        blockColourString = userDefaults.valueForKey("blockColour")
        bc = blockColourString as String
    }
    else {
        var blockColourString : AnyObject = "UIColor.orangeColor()"
        userDefaults.setValue(blockColourString, forKey: "blockColour")
        bc = blockColourString as String
    }

    userDefaults.synchronize()

你是如何定义 bc 的? - franklinexpress
为什么你不想存储UIColor呢? - Timur Bernikovich
Franklin,请看我的编辑。Timur,它会报错,说尝试插入一个非属性列表对象到关键字blockColour中? - user2397282
你使用的是哪个版本的XCode 6?是beta 5吗? - Gergely Orosz
3
这不是重复问题。问:我的汽车无法启动,我觉得需要加油。答:乘公交车吧。是的,他应该正确编码userDefaults();将其作为一个回答添加进去;让发帖者决定是否要避免使用switch/case语句。 - GoZoner
1
@GoZoner 这是在meta上无休止讨论的A/B问题。问题是如何将颜色存储在用户默认设置中。答案是将它们存储为数据,而不是使用一些荒谬的技术将它们编码为字符串,询问关于switch语句不起作用的含糊问题,并帮助提问者继续越来越错。提问者甚至说:“我确定这不是最有效的方法或最简单的方法,但这是我能想到的保存UIColor在NSUserDefaults中的唯一方法。” 这就是这里所问的问题。 - jrturton
1个回答

2

这是一个重复的问题,但是在Swift中没有相应的解决方案。以下是未经测试的一种解决方法:

可能有一种方法是将其归档(就像使用NSColor一样,尽管我没有测试过):

let colorData = NSKeyedArchiver.archivedDataWithRootObject(color)
NSUserDefaults.standardUserDefaults.setObject(colorData forKey:"myColor")

要获取它:

var color : UIColor?
if let colorData = NSUserDefaults.standardUserDefaults.objectForKey("myColor") as? NSData {
    color = NSKeyedUnarchiver.unarchiveObjectWithData(colorData) as UIColor
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接