ios - 如何使用Swift在Xcode中组织文件以进行iOS开发?

标签 ios swift xcode

我应该如何使用Xcode将文件(控制器,模型,帮助器等)组织在文件夹中,最好的访问方式是什么?

enter image description here

最佳答案

遵循MVC结构,如下图所示

enter image description here

以后打开文件结构,项目应如下图所示

enter image description here

主页结构,包含HomeStoryboard(此处为主要故事板)中的所有VC

enter image description here

注意:在物理目录中必须遵循相同的结构。

参考: https://developer.apple.com/library/content/documentation/General/Conceptual/DevPedia-CocoaCore/MVC.html

编辑

文件组织是一种将文件保存在文件夹中的基本方法,就像书架上的书一样,我的意思是同一主题的书在同一行类型上。

在您的文件层次结构中,访问文件并不重要。如果将文件添加到项目目录中,则X代码会自动识别您的文件并相应地建议您。

对于每个文件,您都必须使用init方法才能将该文件放入内存,也可以覆盖init方法。

接受裁判: https://medium.com/ios-objective-creation/lesson-2-creating-custom-classes-in-objective-c-17f760ce9732



编辑(2019年3月27日)

现在,我正在使用这种新模式,这对我很有帮助。

现在您不需要MVC文件夹,我的意思是在父目录中添加模型查看控制器并删除MVC目录。检查下面

enter image description here

这是每个主题的简要说明。

  • 扩展名:它为实例添加了新功能。我在这里保留所有扩展名,每个文件名都是我正在使用的扩展名的类型。检查以下

  • enter image description here
  • 资源:它包含将在项目中使用的资源,例如mp3样本。 gif等。

  • enter image description here
  • 实用程序:我使用将通过应用程序使用的常用功能的实用程序,例如字符串encoding-decoding,获取UDID,Web服务,并将它们相应地分类。

  • 在下面的Device.swift文件中,具有与设备相关的功能,例如Is_Ipad,is_iPhone6_7_8等。

    enter image description here
  • CallAPI:由于我的项目有100多个API,因此将所有这些调用保存在一个文件中非常复杂。因此,我为此保留单独的部分,并根据API的模块对其进行分类。为此,我为API调用增加了一层,以便可以轻松地对其进行管理,并且其可重用性也得到了提高。
  • CallAPI+Home是Home模块的API的扩展。每个模块都有单独的扩展。最后描述它的工作。

    enter image description here
  • helper :它包含所有用作帮助之手的代码,例如枚举,结构,常量等。

  • enter image description here
  • 模型:它包含视图模型(视图的自定义模型)和 API模型(API数据模型)和 NSManagedObjectModel (目前未添加)。

  • enter image description here
  • 视图:它包含所有TableViewCell和CollectionViewCell以及UILabel,UIView等的其他自定义类以及弹出窗口(xib和文件)。

  • enter image description here
  • 控制器:所有控制器,如UIViewController,UITableViewController,UITabBarController等。控制器按模块分类。

  • enter image description here

    enter image description here
  • 故事板:每个故事板均按模块分类。可能某些模块具有多个情节提要。

  • enter image description here

    如果您的应用很小,则可以跳过此部分,直接使用Utility中的API。

    APICall如何工作?

    流程图

    enter image description here
    1. First controller calls CallAPI, every API have its own func to get data and bind into it model.
    2. CallAPI calls Webservices and decides type of API (post, get).
    3. WebServices have alomofire call service. It gets data from service and return back to Call API.
    4. If API result success, then CallAPI binds model data else it shows error alert.
    5. Now Model data is returned to the Call API.
    6. Now callAPi returns Model data to controller.
    

    一些示例代码
  • 在控制器中,
    func validateUserAPI(){
        guard self.isValidateTF() else {
            return
        }
    
        let param = [ "sPassword": Common.encodeBase64(withOutPass: tfPassword.text!)!,
                      "sUserName": Common.encodeBase64(withOutPass: tfUsername.text!)!
            ] as [String : Any]
    
        // Validate User
        CallAPI.submitValidateUser(params: param) { [weak self] (submitResult) in
            guard let aSelf = self else {return}
            let aResultValidate = submitResult.validateUserResult[0]
            if aResultValidate.status == 0 {
                Alert.showAlertError(title: "Error", body: aResultValidate.message)
            }
            else {
                // save data to user defaults
    
            }
        }
    }
    
  • 在CallAPI中,我仅创建了成功处理,如果需要失败处理程序,则也创建它。
    extension CallAPI {
        class func submitValidateUser( params: [String : Any], completionHandler: @escaping ((LoginValidateUser) -> Void)) {
            HUD.startIndeterminate("Loading...")
            WebService.postAlamofire(API.ValidateUser, params: params) { (errMsg, result) in
                HUD.stopIndeterminate()
                if result.isSuccess {
                    // If data success, bind data into model and return back to controller
                    let resultModel = LoginValidateUser(fromDictionary: result.value! as! [String : Any])
                    completionHandler(resultModel)
                }
                else {
                    Alert.showAlertError(title: "Error", body: errMsg!)
                }
            }
        }
    }
    
  • 在网络服务中,
    class WebService {
    
        class func getAlamofire(_ url : String, completionHandler: @escaping (( String?, Result<Any>) -> Void) ){
    
            Alamofire.request(url, method: .get, parameters: nil, encoding: JSONEncoding.default, headers: nil).responseJSON { (jsonResult) in
    
                completionHandler((jsonResult.error?.localizedDescription),jsonResult.result)
    
            }
        }
    
        class func postAlamofire(_ url : String, params: [String:Any], completionHandler: @escaping (( String?, Result<Any>) -> Void) ){
            print("************************************")
            print("************************************")
            print("URL ----> \(url)")
            print("INPUT ----> \(params)")
    
            Alamofire.request(url, method: .post, parameters: params, encoding: JSONEncoding.default, headers: nil).responseJSON { (jsonResult) in
                print("OUTPUT ---->")
                print(jsonResult.result.value)
                completionHandler((jsonResult.error?.localizedDescription),jsonResult.result)
            }
        }
    }
    
  • 在帮助程序中,我创建了一个结构,这里一个结构用于API列表。
    struct API {
        static let ValidateUser             = "\(kBaseURL)ValidateUser"
    }
    
  • 关于ios - 如何使用Swift在Xcode中组织文件以进行iOS开发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44469395/

    相关文章:

    ios - 无法调用非函数类型Swift 3的值

    ios - 不使用默认模板的 Split View Controller 的好教程?

    Swift:当用户关闭应用程序时将图像上传到 Firebase 云存储

    ios - 如何在 iOS/OS X 上使用ripemd128进行散列?

    ios - Xcode TARGET_OS_IPHONE 似乎很困惑,错误或配置错误?

    swift - 在事件监视器 OS X 中防止错误 "funk"声音

    ios - 快速组合 : prepend() before share() prevents initial sink execution

    ios - 模拟器慢动作动画现在打开了吗?

    objective-c - 以相反的顺序对 NSArray 进行排序

    xcode - Mac iCloud 改变了 Xcode Pods 破坏了我的构建