在Swift和count元素中将十六进制颜色转换为RGB

在Swift和count元素中将十六进制颜色转换为RGB,swift,swift2,uicolor,Swift,Swift2,Uicolor,我看到一些答案说在这一行中使用countElements或count,但我的代码中有错误: if(计数(cString)!=6){ 说“不能使用字符串类型的参数列表调用count” 我尝试过其他一些想法,但没有找到正确的解决方案,有什么想法吗 以下是完整的功能: func colorWithHexString (hex:String) -> UIColor { var cString:String = hex.stringByTrimmingCharactersInSet(NSCh

我看到一些答案说在这一行中使用
countElements
count
,但我的代码中有错误:

if(计数(cString)!=6){

“不能使用
字符串类型的参数列表调用
count

我尝试过其他一些想法,但没有找到正确的解决方案,有什么想法吗

以下是完整的功能:

func colorWithHexString (hex:String) -> UIColor {
    var cString:String = hex.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()).uppercaseString

    if (cString.hasPrefix("#")) {
        cString = (cString as NSString).substringFromIndex(1)
    }

    if (count(cString) != 6) {
        return UIColor.grayColor()
    }

    var rString = (cString as NSString).substringToIndex(2)
    var gString = ((cString as NSString).substringFromIndex(2) as NSString).substringToIndex(2)
    var bString = ((cString as NSString).substringFromIndex(4) as NSString).substringToIndex(2)

    var r:CUnsignedInt = 0, g:CUnsignedInt = 0, b:CUnsignedInt = 0;
    NSScanner(string: rString).scanHexInt(&r)
    NSScanner(string: gString).scanHexInt(&g)
    NSScanner(string: bString).scanHexInt(&b)


    return UIColor(red: CGFloat(r) / 255.0, green: CGFloat(g) / 255.0, blue: CGFloat(b) / 255.0, alpha: CGFloat(1))
}

请改为尝试
cString.characters.count

苹果公司在Swift 2中更新了
String
,使其不再符合
CollectionType
协议,该协议定义了
count
。相反,Swift字符串现在通过
characters
属性公开字符集合

这是因为字符串的行为不一定像其他集合—例如,如果向数组中添加数字,则该数组的计数会增加,但向字符串中添加某些unicode字符(例如重音符号)可能不会增加 增加字符串的长度

详细信息在这里

经修正的方法是:

func colorWithHexString (hex:String) -> UIColor {
 var cString:String = hex.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet()).uppercaseString

  if (cString.hasPrefix("#")) {
    cString = (cString as NSString).substringFromIndex(1)
  }

  if (cString.characters.count != 6) {
    return UIColor.grayColor()
  }

  let rString = (cString as NSString).substringToIndex(2)
  let gString = ((cString as NSString).substringFromIndex(2) as NSString).substringToIndex(2)
  let bString = ((cString as NSString).substringFromIndex(4) as NSString).substringToIndex(2)

  var r:CUnsignedInt = 0, g:CUnsignedInt = 0, b:CUnsignedInt = 0;
  NSScanner(string: rString).scanHexInt(&r)
  NSScanner(string: gString).scanHexInt(&g)
  NSScanner(string: bString).scanHexInt(&b)


  return UIColor(red: CGFloat(r) / 255.0, green: CGFloat(g) / 255.0, blue: CGFloat(b) / 255.0, alpha: CGFloat(1))
}

注意一些
vars
已经变成了
let
s,因为当我尝试时,它们从未发生过变异

:if(cString.characters.count!=6){return UIColor.grayColor()}…它会给我诸如“Expected
分隔符”之类的错误在第一行。如果我真的添加了
,那么这一行仍然有一个错误,告诉我“
!=
不是前缀一元运算符错误”…有什么想法吗?奇怪,这一测试对我来说很有效。我想你的代码中可能有其他地方的拼写错误。试着创建一个简单的方法,只使用
字符
来检查字符串的长度,看看你是否得到相同的错误是有意义的!谢谢!!我想知道为什么人们总是坚持将颜色定义为字符串。如果你一直在使用整数。