Well, the error the compiler tells you basically means that you did not specify what's supposed to happen exactly in an unambiguous way, so the "fix" is to be exact.
As is written, the code really gives no clue for the compiler what to infer at all.
You could do something like
let myEqualOp = (==) as (ImageHolder, ImageHolder) -> Bool
myEqualOp(i1, i2)
inside your viewDidLoad but that kind of defeats the purpose of having an operator and not a regular function, I guess.
As @xwu points out, the compiler has two options, but that is not the only cause of the problem, imo.
Both of these operators are global in the sense that when you write them out, syntactically they look like they only belong to a module (at best), not a specific type. Of course the underlying function == (lhs: NSObject, rhs: NSObject) -> Bool is implemented on NSObject, but with the way Equatable and the == operator work, it "looks like" a function that's defined on the module only. You wouldn't write NSObject.==(lhs: img1, rhs: img2) (as you would for other static functions).
Your own == is then truly a global function on your module.
Without specifying which module to refer to now, the compiler cannot know which one to use, as both have basically equal "priority" (for lack of a better word). Or rather I should say nobody can know that, we can only guess. There is no inherent "hierarchy" between your ImageHolder protocol and NSObject (well, in this case the UIImage subclass), so how can we say which one makes more sense?
For normal functions that are not operators, you prefix the function name with the module name in these cases, but I don't know how to do that for operators. I played around a bit with it, but didn't find a way, and I guess it might not be possible? At least the pseudo-syntax I provided above does not work, neither for NSObject's version nor for the really global function/operator you defined.
That being said, I'd advise against defining a module-wide (i.e. global) function that is also an operator at all. Especially the equality operator is strongly tied to the Equatable protocol, so even if you could specify which version to use it can cause all kinds of confusion. The Equatable protocol is exactly meant to ensure the operator is well defined, why "overload" it in such a way?