How self automatically becomes Self type if the function's return type is Self?


(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


(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) #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