Home > database >  How can I know the source object of dot with no prefix, is it SwiftUI or is it Swift?
How can I know the source object of dot with no prefix, is it SwiftUI or is it Swift?

Time:10-01

So, basic question probably but I would like to understand it clearly.

I don't understand the dot something syntax with no prefix. For example the navigationViewStyle below, I can guess that it is a method of the NavigationView which is a struct.

We didn't declare a Navigation View Struct because it's SwiftUI and that is style in this programmatic UI?

In that case when we write dot something how does it know which object to relate to? am I referencing the struct definition or a this instance of the struct?

If I write Self. or self. none of the methods show up.

Also for the .stack, I just picked .stack. When I checked the navigationViewStyle documentation, I did not find the three options (stack, automatic, columns) which appear when coding. What is the origin of the three options? Is it inherited from a higher class or a combintation of multiple protocols? In that case the logic scales up and down, how do you plan out what to do?

My problem is that when I read an already written code it seems organic but my issue is if I want to write code from scratch then unless I memorize the pattern I have no idea how to reach the same decision on what to write.

Also is this just for SwiftUI or in Swift in general?

import SwiftUI

@main
struct MyApp: App {
    var body: some Scene {
        WindowGroup {
            NavigationView {
                SymbolGrid()
            }
            .navigationViewStyle(.stack)
        }
    }
}

CodePudding user response:

.navigationViewStyle() takes anything conforming to NavigationViewStyle and the available styles are also defined as static computed variables for convenience. You can also write .navigationViewStyle(StackNavigationViewStyle()) for the same result, but that seems much less readable in my opinion and therefore you just write .navigationViewStyle(.stack)

You can always just ⌘ (command) click on anything and then "Jump to Definition" to see (or ⌃⌘ click) to see the underlying definition

@available(iOS 13.0, tvOS 13.0, watchOS 7.0, *)
@available(macOS, unavailable)
extension NavigationViewStyle where Self == StackNavigationViewStyle {

    /// A navigation view style represented by a view stack that only shows a
    /// single top view at a time.
    public static var stack: StackNavigationViewStyle { get }
}

As you see NavigationViewStyle.stack will return a StackNavigationViewStyle

CodePudding user response:

To complete @hallo answer, when you have a method that have a parameter of some type, then you can use any static var that are define in the type without needing to specify the type.

struct MyType {
    var myVar: Int
    static var one = MyType(myVar:1)
    static var two = MyType(myVar:2)
}
// suppose you have somewhere a func defined as :
func doSomething(with aVar: MyType {
// do something 
…
}
// you can call the function :
doSomethin(with: MyType.one)
// or
doSomething(with: .one)

In the second call the compiler know that the type of data must be MyType so it will deduce that .one is MyType.one, so you do not have to specify MyType. Just use « .one ». This is some syntaxic sugar from Swift. This also work for enum where you do not have to specify the type in such case.

  • Related