What's the best practice for naming Swift files that add extensions to existing objects?

后端 未结 7 676
面向向阳花
面向向阳花 2021-01-29 20:43

It\'s possible to add extensions to existing Swift object types using extensions, as described in the language specification.

As a result, it\'s possible to create exten

7条回答
  •  无人及你
    2021-01-29 21:26

    If you have a team-agreed set of common and miscellaneous enhancements, lumping them together as an Extensions.swift works as Keep-It-Simple first level solution. However, as your complexity grows, or the extensions become more involved, a hierarchy is needed to encapsulate the complexity. In such circumstances I recommend the following practice with an example.

    I had a class which talks to my back-end, called Server. It started to grow bigger to cover two different target apps. Some people like a large file but just logically split up with extensions. My preference is to keep each file relatively short so I chose the following solution. Server originally conformed to CloudAdapterProtocol and implemented all its methods. What I did was to turn the protocol into a hierarchy, by making it refer to subordinate protocols:

    protocol CloudAdapterProtocol: ReggyCloudProtocol, ProReggyCloudProtocol {
        var server: CloudServer {
            get set
        }
        func getServerApiVersion(handler: @escaping (String?, Error?) -> Swift.Void)
    }
    

    In Server.swift I have

    import Foundation
    import UIKit
    import Alamofire
    import AlamofireImage
    
    class Server: CloudAdapterProtocol {
    .
    .
    func getServerApiVersion(handler: @escaping (String?, Error?) -> Swift.Void) {
    .
    .
    }
    

    Server.swift then just implements the core server API for setting the server and getting the API version. The real work is split into two files:

    Server_ReggyCloudProtocol.swift
    Server_ProReggyCloudProtocol.swift
    

    These implement the respective protocols.

    It means you need to have import declarations in the other files (for Alamofire in this example) but its a clean solution in terms of segregating interfaces in my view.

    I think this approach works equally well with externally specified classes as well as your own.

提交回复
热议问题