记录自己Swift 开发遇到的小问题

1,639 阅读5分钟

由于之前没有用过Swift开发应用,所以使用纯Swift从0开始一个项目,还是会遇到一些不理解的问题的。

本文仅作为我在使用Swift过程中遇到的问题,以及解决方法。仅仅作为自己记录用。 不保证正确,只是记录一下自己理解的过程,后续再来看可能又发现了问题,也可能会觉得这都是啥问题,太基础了,那时候好特么菜啊。

其他人可能也看不懂怎么回事,云里雾里的。 先大概记录下自己的理解,后续再来整理纠正。

1、# selecter 方法怎么传递参数? 目前会能传一个。。 —— 解决办法: 想传多个参数,直接写可能不好写或报错了。 那就先写func 方法,然后在# selecter里去调这个方法,多少参数都行啦😄

2、导航栏默认透明色??   按系统设置。iOS 15之后新特性,必须设置。

3、自定义导航栏,push到下一个界面,怎么自定义返回导航栏?  - 还是要用一个BaseNavigationVC

4、自定义View,传参数进来, 闭包回调。  可以用属性didSet方式,如果数据已经有了,在初始化方法中添加参数。

5、使用Moya请求,Task设置方式: 如果参数是拼在URL后面的   就用return .requestParameters(parameters: params, encoding: URLEncoding.default)   如果参数是放body里面的,   就用 return .requestParameters(parameters: paramsDict, encoding: JSONEncoding.default)方式

Get 请求URL入参问题: 到现在我还是采用在BaseUrl里方式, 后端URL没支持Decode吗是因为? 有特殊字符就不行???

www.jianshu.com/p/32a56897c…

Moya请求入参支持直接传数组类型 解决方案:

www.jianshu.com/p/19f3d0273…

Moya网络请求相关:

1、入参问题 - 支持数组入参。

2、拼接参数问题- 直接将参数拼接在URL后面,有特殊字符?&等,解析失败。   后端处理URL没有做Decode?

3、参数类型。—— 如果是拼在URL后面的   就用 URLEncode   如果参数是放body里面的   就用 JSONEncoding.default。

4、解析: 

A。如果使用Codable解析, Model定义属性类型必须与接口返回的类型一致,即使有一个对不上,也会解析失败

B。如果有值就返回,没有值就返回null的,要定义为可选型,可选型就不用加默认值了。 但要注意,这个可选型也必要要与接口有值时返回的类型一致。

C。其他确定会返回的值,定义为非可选,给一个默认值,解析有值会覆盖的。

D。如果是返回数据data可能为null情况,请求发起就不用再ViewModel里了。不然回调回数据来判空不方便,因为callback了model回来,model都有默认值或可选值,model肯定不为nil了。 直接在VC里发起请求,回来数据直接判nil。

E。使用HandyJson解析时候,属性不与接口返回的类型一致貌似也可以解析成功。 都定义成非可选也行。  ——  要去验证下,属性类型与接口不一致可不可以!!!!=== 可以的,最后为你定义的类型,自动做了转化吗?。。

F。如果返回的data都可能是null,成功就是简单的一个值。 就不用定义新的Model了,直接使用AnyCodable接就行了。

G。基于上面那种情形,请求入参Model要用Model?.self这样可选。

H。如果数据是data: [{},{}]这种,请求的入参Model就是[model].self 即可。

I。设置Model时,不管属性定义为是否可选型,如设置了默认值,有值就覆盖,没有就显示默认值。 定义为可选型,没设置默认值(实际也不用设置),有值返回就解析,没有就都是nil

J。定义Model时,多几个属性、少几个没有关系。 但是不确定类型的必须定义为可选型,而且这个可选型类型必须与有值返回的类型一致。 I。定义Model使用泛型T, 请求或解析时候,如果没有传入T泛型,就直接给具体类型。eg:

struct ExWebRequestModel<T: Codable>: Codable {
    var operate: String = ""
    var data: T
}

struct ExamWebRequestCommonModel: Codable {
    var params: String?
    var path: String?
    var phone: String?
}

struct ExamWebRequestParamModel: Codable {
    var params: ExamWebParamsModel?
    var path: String?
    var phone: String?
}

Model定义为这样,为了可以不同的Model。解析时候这样<>直接给具体Model类型即可。 let model = try App.shared.decoder.decode(ExWebRequestModel<ExWebRequestCommonModel>.self, from: jsonData)

H5与原生交互方面:

1、如果我想在加载H5之前就给H5传点什么东西,使用

let script = WKUserScript(source: "window.platform = 'iOS'", injectionTime: .atDocumentStart, forMainFrameOnly: true)
configuration.userContentController.addUserScript(script) 

这样就能告诉H5是iOS平台了。 

1.1如果想加载完成H5后发送消息,通过

let script = "window.webkit.messageHandlers.messageHandler.postMessage('Hello, H5!')"
webView.evaluateJavaScript(script, completionHandler: nil) 

这个方法给H5发送一个消息。其中window.webkit.messageHandlers.messageHandler.postMessage 这个方法是自定义的,也就是H5写的方法,随便叫什么名称都行,约定好一致即可。

2、如果想处理H5的某些事件。 我们先和H5约定好事件名称,通过configuration.userContentController.add(self, name: "MessageHandle")这个方法约定好。  然后在代理方法   

func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        switch message.name {
            case "MessageHandle":
                print("处理handle数据")
            default: break
        }
    }

这里判断做相应的处理就好了.

友盟不支持真机调试解决方案:

www.jianshu.com/p/32917b7db…

第一次从头到尾申请设置苹果证书相关:

blog.csdn.net/niubitianpi…

JSBridge 方案

juejin.cn/post/684490…

Json字符串互转

www.cnblogs.com/CoderEYLee/…

拍照:

完全自定义相机

www.jianshu.com/p/8b28892ba… blog.csdn.net/u011146511/…

codeantenna.com/a/XbVsJMZku…

条形码扫码

github.com/sunflowerse…

github.com/chenjie1219…

微信支付:

developers.weixin.qq.com/doc/oplatfo…

// 具体步骤

pay.weixin.qq.com/wiki/doc/ap…

demo

www.jianshu.com/p/1b744a97e…