Xcode10新特性

Xcode 10 Xcode 10在macOS Mojave的黑暗模式下看起来非常棒,也让你很容易在macOS应用程序中采用新的外观。Xcode 10测试版包括Swift 4.2和beta sdk,适用于iOS 12、watchOS 5、tvOS 12和macOS Mojave。

SPM搭建Perfect模版服务器

Perfect简介

{% github PerfectlySoft Perfect 60e44e4 width = 30% %} 目前比较流行服务端框架主要有VaporPerfectKituraZewo,他们各有长短,本人这次主要是使用Perfect来写的,因为Perfect的功能比较完善,在GitHub上具有1W+的星,而且有一个非常重要的原因提供了Perfect 中文文档

使用SPM管理依赖库

概念概述

Package Manager {% github it-boyer PerfectTemplate 20294e56 width = 30% %}

Modules模块

在 Swift 中我们使用模块来管理代码,每个模块指定一个命名空间并强制指定模块外哪些部分的代码是可以被访问控制的。

Swift单文件相关命令行工具

直接用 swift 命令执行

xcrun swift可以直接将一个 .swift文件作为命令行工具的输入,这样里面的代码也会被自动地编译和执行。我们甚至还可以在 .swift 文件最上面加上命令行工具的路径,然后将文件权限改为可执行,之后就可以直接执行这个 .swift 文件了:

swift在终端使用LLDB调试

Using the LLDB Debugger 使用LLDB调试器一步一步地运行Swift程序,通过设置断点调试运行状态。

  1. 创建一个名Factorial.swift,定义了一个factorial(n:)函数,并打印调用该函数的结果:
1
2
3
4
5
6
7
func factorial(n: Int) -> Int {
    if n <= 1 { return n }
    return n * factorial(n: n - 1)
}

let number = 4
print("\(number)! is equal to \(factorial(n: number))")
  1. swiftc命令 运行swiftc命令-g选项生成swift调试信息,在目录中生存可执行的Factorial文件:
1
2
3
4
5
$ swiftc -g Factorial.swift
$ ls
Factorial.dSYM
Factorial.swift
Factorial*
  1. 使用lldb启动Factorial文件 通过LLDB调试器命令lldb运行:
1
2
3
$ lldb Factorial
(lldb) target create "Factorial"
Current executable set to 'Factorial' (x86_64).
  1. 设置断点 使用breakpoint set (b) 命令在factorial(n:)函数的第2行中设置一个断点,每次执行函数时中断进程:
1
2
(lldb) b 2
Breakpoint 1: where = Factorial`Factorial.factorial (Swift.Int) -> Swift.Int + 12
  1. 运行调试 使用run (r)命令运行进程。进程在factorial(n:)函数的调用位置停止。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
(lldb) r
Process 40246 resuming
Process 40246 stopped
* thread #1: tid = 0x14dfdf, 0x0000000100000e7c Factorial`Factorial.factorial (n=4) -> Swift.Int + 12 at Factorial.swift:2, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
frame #0: 0x0000000100000e7c Factorial`Factorial.factorial (n=4) -> Swift.Int + 12 at Factorial.swift:2
   1    func factorial(n: Int) -> Int {
-> 2        if n <= 1 { return n }
   3        return n * factorial(n: n - 1)
   4    }
   5
   6    let number = 4
   7    print("\(number)! is equal to \(factorial(n: number))")

Use the print (p) command to inspect the value of the n parameter.

SPM相关命令工具

概念概述

getting-started {% github it-boyer PerfectTemplate 20294e56 width = 30% %}

使用Swift编译系统

Swift 编译系统为编译库、可执行文件和在不同工程之间共享代码提供了基本的约定。

swift 工具

  • swift package
  • swift package generate-xcodeproj
  • swift run
  • swift build
  • swift test

swift package创建一个HelloSPM

  1. 创建Hello目录,目录名会作为SPM名称:
1
2
$ mkdir Hello
$ cd Hello
  1. swift package初始化为SPM工程
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$ swift package init
├── Package.swift   // 依赖清单文件
├── README.md
├── Sources         // 源码目录
│   └── Hello
│       └── Hello.swift
└── Tests
├── HelloTests
│   └── HelloTests.swift
└── LinuxMain.swift

每个包在其根目录下都必须拥有一个命名为Package.swift清单文件。如果清单文件为空,那包管理器将会使用常规默认的方式来编译包。 3. swift build编译SPM 编译会先解析Package.swift项目配置和下载依赖库等环境,然后编译源码

利用JavaScript构建OSX原生应用

利用JavaScript构建OSX应用 Example OS X applications written in JavaScript. JavaScript for Automation Cookbook 廖雪峰的JavaScript教程 W3Cschool javascript教程 JavaScript快速入门

使用场景

UIAutomation的简单使用方法 如何使用UIAutomation进行iOS 自动化测试(Part I) JavaScript for OS X Automation by Example JavaScript For Automation iOS 程序员效率提升利器之 AppleScript Numbers入门 — 附录:脚本 AppleScript 与 Numbers

修改Mac用户名导致丢失管理员权限问题修复

出现的问题主要有两点

  1. 数据恢复问题 1)修改用户名后,mac系统认为是创建了一个新的用户,这时候,之前管理员账号的数据在当前用户的finder里是看不到的。这时候可以去到桌面,点击又上角的“前往” 。
  2. 管理员权限问题 虽然数据问题恢复了,但是另外一个更严重的问题又出现了。新的用户名账号只是一个普通用户账号,没有管理员权限没有管理员权限了。在需要管理员权限的操作中输入具有管理员权限的前用户名和密码也不认了。 解决办法:
  3. 创建一个新的具有管理员权限的用户 第一步:重启电脑,并长按组合键:command+s进入Single User Model模式,出现像DOS一样的提示符 。 第二步:在命令行顺序输入命令:
1
2
3
4
fsck -y
mount -uaw /
rm /var/db/.AppleSetupDone
reboot

苹果电脑会重启,并且在开机后出现新装机时的欢迎界面。重新建立一个新的管理员账号。

巡查自查整合类图

  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
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
title 巡查及处理整合迭代
center header
巡查执法及处理整合设计实现图
endheader

'******* 类声明模块 *******'
'类型:class,abstract,interface,annotation,enum'
'访问域:(-)私有,(#)保护,(~)包私有,(+)公有'

class TagCenter{
-- 私有属性-- '分隔符--,..,==,__'
IBOutlet UIScrollView *titleScrollView;
IBOutlet UIScrollView *contentScrollView;
NSMutableArray *titleLabels;
IBOutlet PatrolSearchBar *ibSearchBar;
IBOutlet UIView *ibErrorView;
ReqFilterStoreModel *filterModel;
__初始化 滚动标题方法__
// 初始化UIScrollView
- (void)setUpScrollView
// 添加所有子控制器对应标题
- (void)setUpTitleLabel
// 添加所有子控制器
- (void)setUpChildViewController
}
package 过滤工具 <<Folder>>{
class JHTagListView{
--动画属性--
IBOutlet NSLayoutConstraint *ibTableViewToLeftViewConut;
IBOutlet NSLayoutConstraint *ibShadeToFilterViewConut;
--方法--
-(void)setupFilterView:(NSArray *)dataArray;
-(void)loadDataList:(dispatch_group_t)group;
-(void)showListView;
}
JHTagListView *-- JHFilterStoreTypeCell
UICollectionView ()- JHFilterStoreTypeCell 
class JHFilterStoreTypeCell{
--接口属性--
NSString *typeName;
NSArray *tagArr;
}
JHTagListView *-- JHFilterPatrolTimeCell
class JHFilterPatrolTimeCell{

}
JHFilterPatrolTimeCell *-- DateAlertPickerController 
class DateAlertPickerController{
}
note left of DateAlertPickerController
时间选择器的封装
end note
note right of JHFilterPatrolTimeCell
定义时间cell样式
end note

note top of JHFilterStoreTypeCell
定义业态类型样式
end note 


}
'显示/隐藏类,类方法属性等 关键字支持class,interface,enum'

'---- 声明类关系线备注,可以当做用例来参与到关系连接中 ---'
note "实现过滤UI及业务的类" as filterClassnote

'###### 类备注模块 类声明末尾使用:note 位置: 备注#########'
note left of TagCenter #red
整个框架的主体:包括搜索框/过滤条件列表/滚动标签
end note

'&&&&&& 类组合模块 类模块 &&&&&&&'
'六种组合样式:Node,Rectangle,Folder,Frame,Cloud,Database'
package tagList <<Folder>>{
class tagBase{
-- 属性-- '分隔符--,..,==,__'
TagListType curTagType; //标签类型
NSMutableArray *dataArray; //列表数据源
__ getter/setter方法__
-(NSMutableArray *)dataArray //通过标签类型过滤出当前列表的数据源
}
package 基础类 <<Folder>> {
class JHTagBanLiModel{
ddd
}
class JHTagBanliCell{
ddd
}
}

package 巡查执法 <<Folder>>{
tagBase <|-- DaiBan
class DaiBan{
--属性--
tagtype
redhot //红点显示
--方法--
tableView
}
tagBase <|-- YiBanVC 
package YiBan <<Folder>>{
class YiBanVC{
dddd
}
YiBanVC *-- YiBanCellView
JHTagBanliCell <|-- YiBanCellView 
tagBase <|-- Guanli
class Guanli{
--属性--
tagtype
--方法--
tableView
} 
}

}
package 自检自查 <<Folder>>{
tagBase <|-- YiZCha
class YiZCha{
--属性--
tagtype
--方法--
tableView
}
tagBase <|-- WeiZCha
class WeiZCha{
--属性--
tagtype
--方法--
tableView
}
}
}

'>>>>>> 类关系图及连接备注模块 >>>>>>>>'
'关系节点符:(|>)继承,(*)合成 ,(o)聚合, 其他#,x,},+,^ 连线符:(--)实线 ,(..)虚线'
TagCenter "1" *-down[#red]- "3+2"tagBase:列表基类 >
note left on link #green
解偶列表与搜索功能相关的UI和业务
end note
TagCenter "1" *-down[#red]- "1"JHTagListView:过滤条件列表 >






center footer
类图实现设计图
endfooter