When declaring a public class or struct the properties still default to 
internal.
```
public final class NewType {
        /// This property defaults to internal.
        var property: Any?
}
```

This is not the same for a public extension on the type, where then the access 
modifier is respected for any function or calculated property within the 
extension.
```
public extension NewType {
        /// This function inherits the public modifier.
        func function() {
        }
}
```

I dislike this inconsistency, and I frequently find that when using my dynamic 
frameworks my code will not compile, and it will be due to my accidentally 
writing a public struct but not declaring the properties public.

I believe in the idea that explicitly stating the access modifier leads to more 
legible code, but in my opinion it can be overdone, and I much prefer to 
explicitly state my intentions in the modifier on the definition or extension. 
For example:

```
public struct Coordinate {
        /// Should default to public.
        let latitude: Double
        /// Should default to public.
        let longitude: Double
        /// Should default to public
        init?(latitude: Double, longitude: Double) {
                guard validate(latitude: latitude, longitude: longitude) else { 
return nil }
                …
        }
}
internal extension Coordinate {
        /// Convenience initialiser to me used internally within the module.
        init(coordinate: CLLocationCoordinate2D) {
                …
        }
}
private extension Coordinate {
        /// Private validation of the coordinate.
        func validate(latitude: Double, longitude: Double) -> Bool {
                …
        }
}
```

This is legible and intuitive. The current behaviour is not.

_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to