给 UIView 添加虚线
Code
1 | class ViewController: UIViewController { |
Demo

判断 UITapGestureRecognizer 是否点击在某个 view 上
将 UIView 转换为 UIImage
Method One
1 | let image: UIImage? |
Method Two
1 | let render = UIGraphicsImageRenderer(size: view.bounds.size) |
iOS请求通知、获取通知状态、跳转到设置页面的实现
iOS 使用 UNUserNotificationCenter 类去管理通知相关的活动
请求通知
1 | let center = UNUserNotificationCenter.current() |
获取通知状态
1 | let center = UNUserNotificationCenter.current() |
跳转到设置页面
1 | let application = UIApplication.shared |
关闭 SIP(System Integrity Protection)
Objective-C 基础
Hello, World!
1 | #import <Foundation/Foundation.h> |
Command Line Compile and Run
1 | clang -fobjc-arc hello.m -o hello && ./hello |
Instance and Method
Objective-C 采用特定的语法对类和实例应用方法: [ClassOrInstance method] 以及将特定的值作为方法参数 [ClassOrInstance argc: value]
Objective-C Class
一个程序在逻辑上分为3个部分:
@interface部分@implementation部分program部分
其中,@interface 部分用于描述类和类的方法; @implementation 部分用于描述数据(类对象的实例变量存储的数据),并实现在接口中声明方法的实际代码;program 部分的程序代码实现了程序的预期目的
@interface 部分
按照约定,类名以大写字母开头,但这不是必须的
1 | @interface NewClassName: ParentClassName |
实例方法以负号(-)开头,实例方法能够对类的实例执行一些操作,如设置值;
类方法以正号(+)开头,类方法是对类本身执行某些操作的方法,如创建类的新实例
@implementation 部分
1 | @implementation NewClassName |
NewClassName 表示的名称与 @interface 部分的名称相同
@implementation 部分中的 methodDefinitions 部分包含在 @interface 部分指定的每个方法的代码中,每种方法的定义通过方法的类型(或者实例)、它的返回值和参数进行标识,并将方法的代码放入一对花括号中
program 部分
program 部分包含解决特定问题的代码,可以跨越多个文件,但必须存在仅有一个的 main 函数
新建一个类的实例:instance = [[ClassName alloc] init]
调用实例的方法:[instance method: value]
Data Type
Objective-C 的基本类型有:char 、int、float、 doubleObjective-C 的限定词有:long、long long、short、unsigned 和 signedid 类型:id 数据类型可存储任何类型的对象
Loop Structure
for 语句
1 | for (init_experssion; loop_condition; loop_expression) { |
while 语句
1 | while (expression) { |
do 语句
1 | do { |
break 和 continue
Choice Structure
if 语句
1 | if (expression1) { |
switch 语句
1 | switch (expression) { |
conditional 运算符
条件运算符也叫三目运算符
1 | condition ? expression1 : expression2 |
存取方法
在接口部分使用 @property 指令标识属性,在实现部分使用 @synthesize 指令标识属性,这样编译器就会自动生成存取方法,无需自己编写 getter 和 setter 方法了;当然,你也可以不在实现部分使用 @synthesize 指令,那么编译器会生成以下划线(_)开头的实例变量名
Root Class
1 | @interface ClassName: NSObject |
NSObject 是任何类的根类
使用 @try 处理异常
1 | @try { |
override init method
1 | - (instancetype) init |
instancetype 是关键字
Category
将类的定义模块化到相关方法的分类中
1 | @interface ClassName(CategoryName) |
Class’s Extension
类的扩展是一个未命名的分类
1 | @interface ClassName () |
Protocol
使用 @protocol 指令定义一个协议
定义:
1 | @protocol ProtocolName |
使用:
1 | @interface InterfaceName: ParentClassName <ProtocolName, otherProtocolName> |
对于没有实现的协议方法,使用 @optional 指令修饰,该指令之后列出的所有方法都是可选的
Conditional Compile
1 | #ifdef condition |
Cocoa
术语 Cocoa 总的来说指的是 Foundation 框架、Application Kit 框架和名为 Core Data 的第三方框架
Cocoa Touch
术语 Cocoa Touch 是指 Foundation、Core Data 和 UIKit 框架
Reference
[1] Kochan S G . Objective-C程序设计[M]. 电子工业出版社, 2012.
PAT 1091 N-自守数 (15)
如果某个数 K 的平方乘以 N 以后,结果的末尾几位数等于 K,那么就称这个数为“N-自守数”。例如 3×$92^2$
=25392,而 25392 的末尾两位正好是 92,所以 92 是一个 3-自守数。
本题就请你编写程序判断一个给定的数字是否关于某个 N 是 N-自守数。
输入格式:
输入在第一行中给出正整数 M(≤20),随后一行给出 M 个待检测的、不超过 1000 的正整数。
输出格式:
对每个需要检测的数字,如果它是 N-自守数就在一行中输出最小的 N 和 N$K^2$ 的值,以一个空格隔开;否则输出 No。注意题目保证 N<10。
输入样例:
3
92 5 233
输出样例:
3 25392
1 25
No
分析:
计算一个数num的平方乘以一个1到9的数,如果算出来的数末尾某几位数等于num,则它就是N-自守数
Code:
1 | #include <iostream> |
PAT 1093 字符串A+B (20)
给定两个字符串 A 和 B,本题要求你输出 A+B,即两个字符串的并集。要求先输出 A,再输出 B,但重复的字符必须被剔除。
输入格式:
输入在两行中分别给出 A 和 B,均为长度不超过$10^6$的、由可见 ASCII 字符 (即码值为32~126)和空格组成的、由回车标识结束的非空字符串。
输出格式:
在一行中输出题面要求的 A 和 B 的和。
输入样例:
This is a sample test
to show you_How it works
输出样例:
This ampletowyu_Hrk
分析:
用visit表示某个字符是否已经输出过了,循环遍历字符串,将未输出的字符输出,且将visit中对应的位置置1
Code:
1 | #include <iostream> |
PAT 1092 最好吃的月饼 (20)
月饼是久负盛名的中国传统糕点之一,自唐朝以来,已经发展出几百品种。

若想评比出一种“最好吃”的月饼,那势必在吃货界引发一场腥风血雨…… 在这里我们用数字说话,给出全国各地各种月饼的销量,要求你从中找出销量冠军,认定为最好吃的月饼。
输入格式:
输入首先给出两个正整数 N(≤1000)和 M(≤100),分别为月饼的种类数(于是默认月饼种类从 1 到 N 编号)和参与统计的城市数量。
接下来 M 行,每行给出 N 个非负整数(均不超过 1 百万),其中第 i 个整数为第 i 种月饼的销量(块)。数字间以空格分隔。
输出格式:
在第一行中输出最大销量,第二行输出销量最大的月饼的种类编号。如果冠军不唯一,则按编号递增顺序输出并列冠军。数字间以 1 个空格分隔,行首尾不得有多余空格。
输入样例:
5 3
1001 992 0 233 6
8 0 2018 0 2008
36 18 0 1024 4
输出样例:
2018
3 5
大意及分析:
累加第i种月饼的销量,使用max_element函数求出vector中的最大值,遍历vector,若当前位置的值与max_element函数求出的最大值相等,则是冠军,格式化输出
Code:
1 | #include <iostream> |