闲来无事写了一份 xcconfig 编写指南

👇👇关注后回复 “进群” ,拉你进程序员交流群👇👇

前言

最近项目都搞完了,比较轻松,闲来无事,分享一份xcconfig编写指南吧。希望给需要的人,提供一点小小的帮助,不要忘记点赞就好。

xcconfig指南

首先我们来说说它的语法吧,其实xcconfig文件的语法是非常简单的,每个配置文件都由一系列键值分配组成,这些键值分配具有以下语法:

1.BUILD_SETTING_NAME = value
注释

xcconfig⽂件只有⼀种注释⽅式\。

include导⼊其他设置

在创建xcconfig⽂件的时候,可以根据需求,创建多个。也就意味着,可以通过include关键字导⼊其他的xcconfig内的配置。通过include关键字后接上双引号:

1.#include "Debug.xcconfig"

在搜索引⼊的⽂件时,如果是以/开头,代表绝对路径,例如:

1// 表示确切的⽂件位置
2#include "/Users/ws/Desktop/VIP课程/第⼀节、符号与链接/强化班第⼀节课资料/
 完成代码/LoginApp-冲突/Pods/Target Support Files/Pods-LoginApp/Pods
 LoginApp.debug.xcconfig"

或者通过相对路径,以 ${SRCROOT}路径为开始:

1#include "Pods/Target Support Files/Pods-LoginApp/Pods-LoginApp.debug.xcconfig"
变量

接下来我们来简单的来介绍一下变量吧,也很简单。

首先变量定义,按照OC命名规则,仅由⼤写字⺟,数字和下划线(_)组,原则上⼤写,也可以不。字符串可以是"也可以是'号。变量有三种特殊情况:

1.在xcconfig中定义的变量与Build Settings的⼀致,那么会发⽣覆盖。可以通过 $(inherited),让当前变量继承变量原有值。例如:

1.OTHER_LDFLAGS = -framework SDWebImage
2.OTHER_LDFLAGS = $(inherited) -framework AFNetworking
3.// OTHER_LDFLAGS = -framework SDWebImage -framework AFNetworking

特别注意⚠:有部分变量不能通过xcconfig配置到Build Settings中,例如:配置PRODUCT_BUNDLE_IDENTIFIER不起作⽤。

2.引⽤变量,()和{}两种写法都可以:

1.VALUE=Cat
2.TEACHER=$(VALUE)-${VALUE}

3.条件变量,根据SDK、Arch和Configration对设置进⾏条件化,例如:

1// 指定`Configration`是`Debug`
2// 指定`SDK`是模拟器,还有iphoneos*、macosx*等
3// 指定⽣效架构为`x86_64`
4.OTHER_LDFLAGS[config=Debug][sdk=iphonesimulator*][arch=x86_64]= $(inherited) -framework "Cat"

特别注意⚠:在Xcode 11.4及以后版本,可以使⽤default,来指定变量为空时的默认值:

1$(BUILD_SETTING_NAME:default=value)
优先级(由高到低):
  1. ⼿动配置Target Build Settings

  2. Target中配置的xcconfig⽂件

  3. ⼿动配置Project Build Settings

  4. Project中配置的xcconfig⽂件

最后

Xcode Build Settings对应的xcconfig变量:Xcode Build Settings[1]

参考资料

[1]

Xcode Build Settings: https://xcodebuildsettings.com

作者:iOS小王

https://juejin.cn/post/7023253414653984781

-End-

最近有一些小伙伴,让我帮忙找一些 面试题 资料,于是我翻遍了收藏的 5T 资料后,汇总整理出来,可以说是程序员面试必备!所有资料都整理到网盘了,欢迎下载!

252cc3c64f894bb87a084138b91d4a6d.png

点击👆卡片,关注后回复【面试题】即可获取

在看点这里a247c9cee3198b24bdbe37e5b1820cd5.gif好文分享给更多人↓↓

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
由于电梯调度算法有多种不同的实现方法,以下仅提供一种简单的参考实现: 首先需要定义电梯状态,包括当前楼层、运行方向、当前乘客数量。定义一个包含所有电梯的数组,并初始化为初始状态。 当有乘客按下电梯按钮时,记录其所在楼层和目标楼层,然后根据算法规则决定将请求派发到哪个电梯。算法规则可以采用贪心、最短路径等不同策略,例如: 1. 遍历所有电梯,如果某一台电梯当前处于闲置状态,那么将其派发到该请求所在楼层。 2. 如果所有电梯都在运行中,那么选择与请求楼层最近的那台电梯,同时遵循以下优先级:当前方向的空闲电梯 > 当前方向的运行电梯 > 反方向的电梯。 3. 如果有多台电梯与请求楼层相同,那么选择其中负载最小的那台电梯。 在每个时间片结束时,检查所有电梯的状态,如果有电梯到达目标楼层,那么调整其状态并更新当前有多少乘客离开或进入电梯。如果所有电梯都处于闲置状态,那么等待下一次请求。如果有更高或更低的请求,那么调整电梯的运行方向并重复上述过程。 简单起见,以下代码省略了初始化、请求存储等部分,仅给出电梯调度逻辑的核心部分: ```c #define MAX_ELEVATORS 4 #define MAX_FLOORS 20 typedef enum { IDLE, UP, DOWN } Direction; typedef struct { int floor; Direction dir; int passengers; } Elevator; Elevator elevators[MAX_ELEVATORS]; int dispatch_request(int source, int target) { int best_elevator = -1; int best_distance = MAX_FLOORS + 1; // 初始化一个比最大楼层数还大的值 // 遍历所有电梯,选择最合适的那台电梯 for (int i = 0; i < MAX_ELEVATORS; i++) { int distance = abs(elevators[i].floor - source); if (elevators[i].dir == IDLE || // 选择状态闲置的电梯 (elevators[i].dir == UP && target > source && elevators[i].floor <= source) || // 当前方向上升且请求在电梯上面 (elevators[i].dir == DOWN && target < source && elevators[i].floor >= source) || // 当前方向下降且请求在电梯下面 distance < best_distance) { // 如果无法满足上述条件,就选择距离最近的电梯 if (elevators[i].dir == IDLE || (elevators[i].dir == UP && target > source && elevators[i].dir != DOWN) || (elevators[i].dir == DOWN && target < source && elevators[i].dir != UP)) { // 如果有多台电梯满足条件,那么根据以下优先级选择其中之一 best_elevator = i; best_distance = distance; } } } // 将请求分派给最优电梯 if (best_elevator != -1) { elevators[best_elevator].dir = source > elevators[best_elevator].floor ? UP : DOWN; return best_elevator; } return -1; // 没有可用电梯,等待下一次请求 } void update_elevator_state(int elevator) { if (elevators[elevator].dir == UP) { elevators[elevator].floor++; } else if (elevators[elevator].dir == DOWN) { elevators[elevator].floor--; } // 到达最高楼层或最低楼层时改变方向 if (elevators[elevator].floor == MAX_FLOORS) { elevators[elevator].dir = DOWN; } else if (elevators[elevator].floor == 1) { elevators[elevator].dir = UP; } // 到达目标楼层时更新状态 // NOTE: 进一步优化时可以加上其他附加的判断条件,如当前是上升还是下降状态、电梯负载等 if (elevators[elevator].floor == elevators[elevator].target_floor) { elevators[elevator].dir = IDLE; elevators[elevator].passengers -= elevators[elevator].leaving; elevators[elevator].passengers += elevators[elevator].entering; elevators[elevator].target_floor = -1; elevators[elevator].entering = 0; elevators[elevator].leaving = 0; } } int main() { while (true) { // 循环执行电梯调度过程 for (int i = 0; i < MAX_ELEVATORS; i++) { update_elevator_state(i); } // 监听是否有请求到达 // 假设有一个名为request_queue的队列,其中的元素格式为{source_floor, target_floor} // 每次轮询队列,将请求分派给可用的电梯 while (!is_empty(request_queue)) { int request[2]; dequeue(request_queue, request); int elevator = dispatch_request(request[0], request[1]); if (elevator != -1) { // 如果有可用电梯,将请求加入指定电梯的进入队列 int entering = rand() % (MAX_CAPACITY - elevators[elevator].passengers + 1); elevators[elevator].target_floor = request[1]; elevators[elevator].entering = entering; elevators[elevator].leaving = elevators[elevator].passengers > entering ? rand() % (elevators[elevator].passengers - entering) : 0; } } // 等待一段时间,然后进入下一个时间片 sleep(500); } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值