skip to Main Content

Following is method from a library in my project

 public convenience init(hueRotate: Double) {
    let c = cos(hueRotate)
    let s = sin(hueRotate)
    let m1 = [0.213, 0.715, 0.072,
              0.213, 0.715, 0.072,
              0.213, 0.715, 0.072]
    let m2 = [0.787, -0.715, -0.072,
              -0.213, 0.285, -0.072,
              -0.213, -0.715, 0.928]
    let m3 = [-0.213, -0.715, 0.928,
              0.143, 0.140, -0.283,
              -0.787, 0.715, 0.072]
    let a = { i in
        m1[i] + c * m2[i] + s * m3[i]
    }
    self.init(values: [a(0), a(1), a(2), 0, 0,
                       a(3), a(4), a(5), 0, 0,
                       a(6), a(7), a(8), 0, 0,
                       0, 0, 0, 1, 0])
}

on this following part of code I am getting compiler error saying The compiler is unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expressions

let a = { i in
    m1[i] + c * m2[i] + s * m3[i]
}

How to fix this?

2

Answers


  1. Swift is having a problem with your equation being too long in the closure of var a. Try splitting the expression into smaller ones, like this:

    let a = { i in
            c * m2[i]
        }
    let b = { i in
            s * m3[i]
        }
    
    let c = { i in
            m1[i]
        }
    
    self.init(values: [a(0) + b(0) + c(0),
                       a(1) + b(1) + c(1),
                       a(2) + b(2) + c(2),
                       0, 0,
                       a(3) + b(3) + c(3),
                       a(4) + b(4) + c(4),
                       a(5) + b(5) + c(5),
                       0, 0,
                       a(6) + b(6) + c(6),
                       a(7) + b(7) + c(7),
                       a(8) + b(8) + c(8),
                       0, 0, 0, 0, 0, 1, 0])
    
    Login or Signup to reply.
  2. It should be enough to tell the compiler what a returns so change the declaration to

    let a = { (i) -> Double in
        m1[i] + c * m2[i] + s * m3[i]
    }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search