swift - 在 Swift 中将十六进制颜色转换为 RGB 并计算元素

标签 swift swift2 uicolor

我看到一些答案说要在这一行使用 countElementscount,但我在我的代码中遇到了错误:

if (count(cString) != 6) {

“无法使用 String 类型的参数列表调用 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

Apple 更新了 Swift 2 中的 String,使其不再符合定义了 countCollectionType 协议(protocol)。相反,Swift 字符串现在通过 characters 属性公开字符集合。

这是因为字符串的行为不一定与其他集合相同 - 例如如果向数组中添加一个数字,您希望该数组的计数增加,但是向字符串中添加某些 unicode 字符(例如重音符号)可能不会 增加字符串的长度。

完整的细节在这里https://developer.apple.com/swift/blog/?id=30

修改后的方法是:

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 因为它们永远不会发生变化

关于swift - 在 Swift 中将十六进制颜色转换为 RGB 并计算元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32297775/

相关文章:

ios - UICollectionView 正在显示,但单元格未快速显示

ios - 在 Xcode Project 中查找本地视频的路径

ios - 使用按钮淡化 UIColor

ios - iOS 中多个打开的 UIViewController 存在内存问题。 swift

ios - 在 iOS 的多个地方使用响应

Swift 包管理器 (SPM) : Error importing library

iOS 获得不同于编程的其他颜色

swift - 构建 Firebase 登录 Xcode

swift - 无法使用参数列表在 Swift 2 中调用 'sendAsynchronousRequest'

ios - NSAttributedString 文本打印出灰色而不是黑色?