suke`s Notice
hexo博客
程序员弯路指南-迫于无聊,入门了一下 swiftui 开发

上一篇文章写了点开发板的记录,基础刚刚看完,下一步需要搞焊接了,没买装备,暂时放下了,

最近莫名想着搞独立开发了,找了各种方向还是觉得做 apple store 的 app 会比较合适,于是拿着 ios14 上线之后很火的 widget 做了些练习,这里记录一下

学习目标

想要用于开发 widget,app 的主要内容还是倾向于使用 flutter

基础语法

这个还没细看,基于 xcode 代码提示和实际问题开始的

入门文档

官方手把手教学 立即开始做一个简单 app

swift 官方文档资源

SwiftUI 程式開發初體驗 medium.com 这是我找到的一个,官方的虽然交互漂亮,但是有点太慢了

https://onevcat.com/ 猫神 似乎是个大咖 出过相关的开发书籍

遇到的问题 解决记录

打开 xcode 找不到组件属性面板

因为 xcode11 之后支持了 canvas 实时预览组件,这个属性面板跟随了 canvas 的显示和隐藏,


右上角点击+号有一个选择组件可以直接拖放的面板,也跟随了这个设置

swift ui 自动撑开父组件

和 flutter 一样,swift ui 常用布局组件类似 html 的display:flex ,但是没有实现类型flex:1的属性

需要使用一个 Spacer 的组件撑开剩余的空间

CocoaPods 使用

1.安装 https://cocoapods.org/

2.使用pod init在工作目录进行初始化,之后打开Profile文件编辑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# Uncomment the next line to define a global platform for your project
# 指定ios版本
platform :ios, '10.0'

# 因为我需要在 app 和 widget 同时使用,所以直接全局安装了
pod 'Alamofire', '~> 5.2'
pod 'SwiftyJSON'

target 'infoExtension' do
# Comment the next line if you don't want to use dynamic frameworks
use_frameworks!
# 在这里安装需要的库
# Pods for infoExtension

end

target 'v2widget' do
# Comment the next line if you don't want to use dynamic frameworks
use_frameworks!



# Pods for v2widget

target 'v2widgetTests' do
inherit! :search_paths
# Pods for testing
end

target 'v2widgetUITests' do
# Pods for testing
end

end

3.编辑完成之后,返回命令行在工作目录执行 pod install 安装 4.安装完成之后需要关闭 xcode,找到工作目录,打开 workspace 文件,这个是 pod 新建的,包含了下载的库

request 网络请求(需要用到一个 Alamofire 的库

上一段已经安装了需要的库
最新版本的 Alamofire 不能直接使用 Alamofire.request 调用,而是声明了一个 AF 的命名空间
使用是类似 AF.request(url)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//声明url !在某些场景下表示必须实现类型
let url = URL(string: "https://www.xxxx.com/api/members/show.json?username=suke971219")!

//responseJSON 表示返回json类型 还支持string及其他类型
var user:User;
AF.request(url,method: HTTPMethod.get).responseJSON{
response in
// response in 相当于 (response)=>{} 但是不知道为什么这里不需要大括号{}
switch (response.result){
case .success(let json):
print(json )//这里的json应该已经转换了 但是是一个Any类型,下一步类型强转
let dict = json as! Dictionary<String,AnyObject>
user = User(json:dict)
print(user)
case .failure(let err):
print("error \(err)")
}
}

Dictionary 到一个实际的 model(直接使用字典类型似乎不是一个好习惯

我找了很多,推荐的都是HandyJSON SwiftyJSON 以及一些其他的框架,但是我使用 pod 安装的时候遇到了一个 swift 版本的问题,我有必须使用最新版本的强迫症,所以没有继续

这是一个简单的例子,在上一段中我们传入了一个 Dictionary 类型的字典,可以直接在初始化的阶段给对象赋值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public struct User {
var username:String?
var website:String?
var github:String?
var avatar_normal:String?
var url:String?
var created:Int?
var location:String?
var id:Int?
var day:String?
var twitter:String?

init(json: Dictionary<String, Any>){
self.username = json["username"] as? String
self.website = json["website"] as? String
self.github = json["github"] as? String
self.avatar_normal = json["avatar_normal"] as? String
self.created = json["created"] as? Int
self.location = json["location"] as? String
self.id = json["id"] as? Int
self.twitter = json["twitter"] as? String
self.day = timeStampToCurrennTime(timeStamp: Double(self.created ?? 0))
}
}

一个转换时间戳的小工具

掘金-swift 时间戳与时间相互转化

模块间相互引用

你可以新建一个目录创建一些工具类的文件,并且只要在文件属性的 target 指定相关的模块就可以直接引用了