Zhao_Xin
(Zhao Xin)
1
See the code:
protocol Foo {
func instance() -> Self
}
class Bar: Foo {
func instance() -> Self {
return self // Declaration: let `self`: Self
}
func other() {
let i = self // Declaration: let `self`: Bar
}
}
How does it happen?
Zhaoxin
hexdreamer
(Kenny Leung)
2
There is no magic happening here. Rather, I think it’s a misunderstanding of what -> Self means. Self is a placeholder for “the current type”, just like self is a placeholder for “the current instance”. So when you declare -> Self, the correct thing to do is an instance of Self, which is self.
You can see this if you replace Self with String.
protocol Foo {
func instance() -> String
}
class Bar: Foo {
func instance() -> String {
return “blah"
}
}
-Kenny
···
On Aug 27, 2016, at 7:05 AM, Zhao Xin via swift-users <swift-users@swift.org> wrote:
See the code:
protocol Foo {
func instance() -> Self
}
class Bar: Foo {
func instance() -> Self {
return self // Declaration: let `self`: Self
}
func other() {
let i = self // Declaration: let `self`: Bar
}
}
How does it happen?
Zhaoxin
_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users
Zhao_Xin
(Zhao Xin)
3
Thanks, Kenny. I found that self is dynamic. Despite the original type of
variable. See below code, `test` variable. It was Foo type, but it can be
Bar as well.
class Foo { func printType() { print(type(of:self)) } func printSelf() {
print(self) } } class Bar:Foo { } let foo = Foo() foo.printType() // Foo
foo.printSelf() // Foo let bar = Bar() bar.printType() // Bar
bar.printSelf() // Bar var test = Foo() test.printType() // Foo
test.printSelf() // Foo test = Bar() test.printType() // Bar
test.printSelf() // Bar
So now I think that self should always be Self type.
Zhaoxin
···
On Sun, Aug 28, 2016 at 2:05 PM, Kenny Leung via swift-users < swift-users@swift.org> wrote:
There is no magic happening here. Rather, I think it’s a misunderstanding
of what -> Self means. Self is a placeholder for “the current type”, just
like self is a placeholder for “the current instance”. So when you declare
-> Self, the correct thing to do is an instance of Self, which is self.
You can see this if you replace Self with String.
protocol Foo {
func instance() -> String
}
class Bar: Foo {
func instance() -> String {
return “blah"
}
}
-Kenny
> On Aug 27, 2016, at 7:05 AM, Zhao Xin via swift-users < > swift-users@swift.org> wrote:
>
> See the code:
>
> protocol Foo {
> func instance() -> Self
> }
>
> class Bar: Foo {
> func instance() -> Self {
> return self // Declaration: let `self`: Self
> }
> func other() {
> let i = self // Declaration: let `self`: Bar
> }
> }
>
> How does it happen?
>
> Zhaoxin
> _______________________________________________
> swift-users mailing list
> swift-users@swift.org
> https://lists.swift.org/mailman/listinfo/swift-users
_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users