On Aug 16, 2024, at 10:17, Larry Garfield <la...@garfieldtech.com> wrote:
> 
> I would have to research to see if other languages did this, but one option 
> would be to allow an inner class to extend an outer class even if it's final, 
> which would essentially give us sealed classes for free:
> 
> final class Outer
> {
>  class InnerA extends Outer {}
>  class InnerB extends Outer {}
>  class InnerC extends Outer {}
> }
> 
> // But this is still not OK:
> class Sibling extends Outer {}
> 
> Note: I have no idea how difficult/complicated this would be, but I would be 
> in favor of exploring it.
> 
> --Larry Garfield


Swift allows nested classes to extend their parent. It does not allow nested 
classes to extend a final parent. Visibility modifiers can be applied and work 
as expected. Basically, types also function as the equivalent of a namespace. 
More broadly, any type can be nested in any other type, so you could certainly 
do something weird like:

```
class A {
        enum E {
                class C: A {}
                
                case a(A)
                case c(C)
        }
}

let e = A.E.c(A.E.C())
```

However, you could implement your sealed class example by having a private 
constructor:

```
class Parent {
        final class Child : Parent {
                override init() { //within lexical scope of Parent, so can see 
Parent's private members
                        super.init()
                }
        }
        
        private init() {}
}

let parent = Parent() //'Parent' initializer is inaccessible due to 'private' 
protection level
let child = Parent.Child() //ok
```

Swift also has a fileprivate visibility, so the same could be accomplished with 
a fileprivate init on Parent with a non-nested Child in the same file.

-John

Reply via email to