[swift-evolution] ability to derive a class from a struct or other value type
Mike Kluev
mike.kluev at gmail.com
Fri Jun 23 10:20:22 CDT 2017
on Fri Jun 23 05:26:11 CDT 2017 Haravikk swift-evolution at haravikk.me
wrote:
> Not sure what you mean by added indirection here, the following seems
perfectly straightforward to me:
>
> protocol Foo {
> var someValue:Int { get set }
> func a() -> Any?
> }
>
> extension Foo {
> func a() -> Any? { return self.someValue }
> }
>
> struct ValueSemantics:Foo { var someValue:Int }
> class ReferenceSemantics:Foo {
> var someValue:Int { return nil }
> }
>
> There is no added access overhead here, the only difference is that the
protocol itself leaves it up to
> implementations whether someValue is stored or computed.
in real cases there would be more variables:
//============
protocol P1 { // #noise
var var1: Int { get set } // #noise
var var2: Int { get set } // #noise
// ... // #noise x 100
var var100: Int { get set } // #noise
func foo1() -> Int // #noise
func foo2() -> Int // #noise
// ... // #noise x 100
func foo100() -> Int // #noise
}
extension P1 { // #noise
func foo1() -> Int { return var1 * 2 }
func foo2() -> Int { return var2 * 2 }
// ...
func foo100() -> Int { return var100 * 2 }
}
struct S1: P1 {
var var1: Int // #noise
var var2: Int // #noise
// ... // #noise x 100
var var100: Int // #noise
}
class C1: P1 {
var var1: Int = 0 // #noise
var var2: Int = 0 // #noise
// ... // #noise x 100
var var100: Int = 0 // #noise
}
//============
lots of noise and violations of DRY. you may try to mitigate it by putting
all those storage into another struct, that was the indirection i was
thinking about:
//============
struct Pimpl { // #noise
var var1: Int = 0
var var2: Int = 0
// ...
var var100: Int = 0
func foo1() -> Int { return var1 * 2 }
func foo2() -> Int { return var2 * 2 }
// ...
func foo100() -> Int { return var100 * 2 }
}
protocol P2 { // #noise
var pimpl: Pimpl { get set } // #noise
func foo1() -> Int // #noise
func foo2() -> Int // #noise
// ... // #noise x 100
func foo100() -> Int // #noise
}
extension P2 { // #noise
func foo1() -> Int { return pimpl.var1 * 2 } // #indirection
func foo2() -> Int { return pimpl.var2 * 2 } // #indirection
// ... // #indirection x
100
func foo100() -> Int { return pimpl.var100 * 2 } // #indirection
}
struct S2: P2 {
var pimpl: Pimpl // #noise
init() {
pimpl = Pimpl() // #noise
}
}
class C2: P2 {
var pimpl: Pimpl // #noise
init() {
pimpl = Pimpl() // #noise
}
}
//============
while the proposed solution has minimal amount of noise:
//============
struct S3 {
var var1: Int
var var2: Int
// ...
var var100: Int
func foo1() -> Int { return var1 * 2 }
func foo2() -> Int { return var2 * 2 }
// ...
func foo100() -> Int { return var100 * 2 }
}
class C3: S3 {
}
// ===========
Mike
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20170623/7814d911/attachment.html>
More information about the swift-evolution
mailing list