When defining a custom operator, I am not able to put the declaration for it in the same file as the code for the operator if the code for the operator resides in a different file.
For example, this works (all in the same file):
// main.swift
// Emulating C++ ostream
struct Ostream {
}
// Insertion operators
extension Ostream {
@discardableResult
static func endl (_ u: Ostream) -> Ostream {
print ()
return u
}
}
extension Ostream {
@discardableResult
static func << (u: Ostream, v: String) -> Ostream {
print ("\(v)", terminator: "")
return u
}
}
extension Ostream {
@discardableResult
static func << (u: Ostream, v: Int) -> Ostream {
print ("\(v)", terminator: "")
return u
}
}
extension Ostream {
@discardableResult
static func << (u: Ostream, v: Double) -> Ostream {
print ("\(v)", terminator: "")
return u
}
}
extension Ostream {
@discardableResult
static func << (u: Ostream, v: (Ostream)->Ostream) -> Ostream {
return v (u)
}
}
// ---------------------------------------------------------
//
precedencegroup OstreamPrecedence {
associativity : left
lowerThan : AssignmentPrecedence
}
infix operator << : OstreamPrecedence
// ---------------------------------------------------------
//
let os = Ostream ()
let endl = Ostream.endl
os << "PI is approximately 22.0/7.0: " << 22.0 / 7.0 << endl
If, however, I put the code for Ostream
into a different file:
// Ostream.swift
Expand
// Ostream.swift
//
// Emulating C++ ostream
struct Ostream {
}
// Insertion operators
extension Ostream {
@discardableResult
static func endl (_ u: Ostream) -> Ostream {
print ()
return u
}
}
extension Ostream {
@discardableResult
static func << (u: Ostream, v: String) -> Ostream {
print ("\(v)", terminator: "")
return u
}
}
extension Ostream {
@discardableResult
static func << (u: Ostream, v: Int) -> Ostream {
print ("\(v)", terminator: "")
return u
}
}
extension Ostream {
@discardableResult
static func << (u: Ostream, v: Double) -> Ostream {
print ("\(v)", terminator: "")
return u
}
}
extension Ostream {
@discardableResult
static func << (u: Ostream, v: (Ostream)->Ostream) -> Ostream {
return v (u)
}
}
// ---------------------------------------------------------
//
precedencegroup OstreamPrecedence {
associativity : left
lowerThan : AssignmentPrecedence
}
infix operator << : OstreamPrecedence
// main.swift
// main.swift
//
let os = Ostream ()
let endl = Ostream.endl
os << "PI is approximately 22.0/7.0: " << 22.0 / 7.0 << endl
I get these errors:
Adjacent operators are in non-associative precedence group 'BitwiseShiftPrecedence'
Binary operator '/' cannot be applied to two 'Ostream' operands
Binary operator '<<' cannot be applied to operands of type 'Double' and '(Ostream) -> Ostream'
But why?