从 Xcode 10 开始,构建脚本阶段可以使用文件列表 ( .xcfilelist
) 进行输入和输出,而不是直接指定输入/输出文件。这些文件似乎支持注释(WWDC 示例在顶部显示了命令行注释)、空行(也在示例中),并且希望每行一个文件路径。如果这些文件包含构建设置(例如$(SRCROOT)
),它们会在调用脚本之前展开,就像如果文件路径直接作为输入/输出文件被提供一样,它们会被展开。
这听起来是一个很棒的功能,但是您将如何在实际脚本中使用这些文件列表?
当直接指定文件时,你有 shell 变量SCRIPT_INPUT_FILE_COUNT
,SCRIPT_OUTPUT_FILE_COUNT
然后是每个输入/输出文件的一个变量,命名SCRIPT_INPUT_FILE_#
和SCRIPT_OUTPUT_FILE_#
位置#
曾经是一个向上计数的数字。假设您有相同数量的输入/输出文件,此脚本将打印所有文件:
#!/bin/sh
: $((i=0))
while [ $i -lt "$SCRIPT_INPUT_FILE_COUNT" ]
do
eval fileIn="\$SCRIPT_INPUT_FILE_${i}"
eval fileOut="\$SCRIPT_OUTPUT_FILE_${i}"
echo "$fileIn --> $fileOut"
: $((i=i+1))
done
Run Code Online (Sandbox Code Playgroud)
这是一个干净的 POSIX 兼容 shell 脚本,是的,你可以在需要时让它更好,bash
但上面的代码应该适用于每个sh
兼容的 shell(它在使用#!/bin/sh
和 not时也承诺#!/bin/bash
)。
但是当使用文件列表时,它SCRIPT_INPUT_FILE_COUNT
是 0。相反,你得到SCRIPT_INPUT_FILE_LIST_COUNT
andSCRIPT_OUTPUT_FILE_LIST_COUNT
和变量SCRIPT_INPUT_FILE_LIST_#
and SCRIPT_OUTPUT_FILE_LIST_#
,包含预处理文件列表的路径,其中所有注释和空行都已被删除,所有构建设置都已展开。
现在,我将如何在我的脚本中使用这些文件列表?上面的小示例脚本如何使用 Xcode 中的文件列表生成相同的输出?我不是很擅长 shell 脚本,我正在寻找一个干净的解决方案,它不需要任何其他脚本解释器,但sh
.
我可以理解为什么有公共和私人访问修饰符,这两个也几乎可以在任何语言中找到.我甚至可以理解为什么可能有一个包修饰符,因为你可能希望你的类(那些紧密相关的类)以某种方式相互交互,这不适合公共交互(例如,因为它取决于知识的class internals,也许是因为它会泄露一个秘密,或者因为它可能随时改变并依赖它会破坏所有现有代码,等等).但是,为什么我想要一个受保护的标识符?别误会我的意思,我知道什么是受保护的意思是,但为什么我希望我的类的子类访问某些实例变量或使用某些方法,只是因为它们是子类,即使它们是不同包的一部分?什么是受保护的真实世界用例?
(并且作为实例变量的参数的性能不计,因为JIT编译器总是可以内联访问器方法,将其调用开销减少到零)
我正在使用 UDP 套接字发送数据包,我想检查接收数据包的 IP 标头中的 TTL 字段。是否可以?
我注意到 IP_HDRINCL sockoption 但它似乎只适用于 RAW 套接字。
clang
允许以下循环语法:
for (...) @autorelease { ... }
while (...) @autorelease { ... }
do @autorelease { ... } while (...);
Run Code Online (Sandbox Code Playgroud)
到目前为止,我还没有找到关于该语法的任何文档(Apple在其指南中没有使用这种语法,至少在引入@autorelease
构造的指南中没有),但是假设上面的三个语句等同于以下三个陈述:
for (...) { @autorelease { ... } }
while (...) { @autorelease { ... } }
do { @autorelease { ... } } while (...);
Run Code Online (Sandbox Code Playgroud)
因为这是我所期望的(按标准C语法规则),但我不完全确定是否真的如此.它也可能是一些"特殊语法",其中自动释放池不会针对每次循环迭代进行更新.
背景信息:
我有一个编程语言的愿望,知道这样做的工具,我没有任何关于如何使用它们的好例子。我真的不想使用 Flex 或 Bison,因为它们没有教授我认为创建编译器所需的抽象性。我有创建字符串、标记它们、将它们提供给充当语法和解析的文件的概念,最终创建一个实际的程序来运行该语言。问题是,我不知道如何编写标记器或解析器。我有一般的想法,但当我看到例子时我会更好地理解。如果有人可以发布一个/几个示例,那就太好了!
我的问题如下:
有人可以发布如何在 C 中编写语法标记器/解析器的示例吗?
考虑一下C中的以下代码:
void someFunction ( int type, void * someData ) {
unsigned value = (int)someData;
}
Run Code Online (Sandbox Code Playgroud)
我知道这段代码看起来有些奇怪,但是该函数是一个回调函数,并且该回调函数必须带有一个void *
参数,因为someData
实际上通常是指向某个内存结构的指针(type
会告诉我哪种结构),但在这种情况下,它不是t。在那种情况下,它实际上只是一个无符号的int值;不是指向该值的指针,而是指向值本身。调用方实际上是这样调用此函数的:
unsigned value = ...;
callbackFunction(type, (void *)value);
Run Code Online (Sandbox Code Playgroud)
是的,这很愚蠢,但我尚未编写代码,也无法更改。我只需要实现回调。我真的很想在Swift(Swift 3)中这样做。但是在Swift中,回调必须看起来像这样:
func someFunction ( _ type: Int, _ someData: UnsafeMutableRawPointer? ) -> Void
Run Code Online (Sandbox Code Playgroud)
我的函数就很好了...但是我如何获取数字指针值,因为我需要无符号的int值并将其传递给另一个函数。
我已经看到了很多C代码,它们试图在调用fork()
和调用之间关闭所有文件描述符exec...()
。为什么我通常会这样做,以及在我自己的代码中执行此操作的最佳方法是什么,因为我已经看到了许多不同的实现?
如何捕获单击一行NSTableView
并触发动作的事件?(理想情况下,它应该仅针对左键单击触发操作,而不是右键单击,但这不是必需的.)
实现-tableViewSelectionDidChange
表视图的委托接近我想要的.但是,如果当前选择了一行,则再次单击该行不会调用,-tableViewSelectionDidChange
因为选择未更改.
使用协议扩展,只要我提供一个实现,我就可以使任何对象符合我自己的协议。例如,假设我创建了一个协议:
protocol Printable {
// ... whatever ...
}
Run Code Online (Sandbox Code Playgroud)
现在我可以像这样打印字符串和整数:
extension String: Printable {
// ... whatever is required to satisfy protocol ...
}
extension Int: Printable {
// ... whatever is required to satisfy protocol ...
}
Run Code Online (Sandbox Code Playgroud)
这是一种非常酷的编程方式,因为我现在可以将字符串和整数输入到任何可以处理 Printable 的函数中。
现在,如果我有一个可打印数组,则整个数组都是可打印的,所以我尝试这样做:
extension Array<Printable>: Printable {
// ... whatever is required to satisfy protocol ...
}
Run Code Online (Sandbox Code Playgroud)
但编译器不喜欢它。
必须在非专用泛型类型“Array”上声明约束扩展,并使用“where”子句指定约束。
对于正常的扩展来说这不是问题。我可以这样做:
extension Array where Element: Printable {
}
Run Code Online (Sandbox Code Playgroud)
这按预期工作。我在上面的扩展中添加的内容仅适用于可打印元素的数组。但这不会使可打印元素数组符合可打印协议本身。这只是一个普通的扩展,而不是所谓的“协议扩展”。
如果您的代码需要仅在macOS 10.12或更高版本中可用的功能,但又希望代码也可以部署到较早的系统版本,则可以@available
在Objective-C中使用:
if (@available(macOS 10.12, *)) {
// Code that requires 10.12 APIs
} else {
// Code that doesn't require 10.12 APIs
}
Run Code Online (Sandbox Code Playgroud)
您可以在Swift中使用#available
以下命令执行相同的操作:
if #available(OSX 10.12, *) {
// Code that requires 10.12 APIs
} else {
// Code that doesn't require 10.12 APIs
}
Run Code Online (Sandbox Code Playgroud)
但是,如果编写C或C ++代码,可以使用什么呢?
我有一个文件服务器作为要同步的文件的主存储,我有几个客户端具有主存储的本地副本。每个客户端都可以更改主存储中的文件、添加新文件或删除现有文件。我希望他们通过定期执行同步操作尽可能保持同步,但我在任何地方都可以使用的唯一工具是rsync
,我只能在客户端上运行脚本代码,而不能在服务器上运行。
rsync
不执行双向同步,所以我必须从服务器同步到客户端以及从客户端到服务器。这对于刚刚通过运行两次rsync
操作更改的文件来说是正常的,但是在添加或删除文件时会失败。如果我不使用rsync
删除选项,客户端将永远无法删除文件,因为从服务器到客户端的同步会恢复它们。如果我使用删除选项,则从服务器到客户端的同步首先运行并删除客户端添加的所有新文件,或者从客户端到服务器的同步首先运行并删除其他客户端添加到服务器的所有新文件。
显然rsync
单独无法处理这种情况,因为它只能使一个位置与另一个位置同步。我当然需要编写一些代码,但我只能依赖 POSIX shell 脚本,这似乎使我无法实现目标。那么它甚至可以完成rsync
吗?
当我使用 Xcode 15 构建 UI 应用程序并在 macOS 14 (Sonoma) 上运行该应用程序时,多个视图中的 UI 大部分缺失。在 macOS 14 之前的任何系统上运行相同的构建时,UI 看起来都很好。使用 Xcode 14.3.1 构建并在 macOS 14 上运行应用程序时,UI 看起来也很好。只是 Xcode 15 和 macOS 14 的组合导致了这种情况问题。
作为一种解决方法,我继续使用 Xcode 14.3.1 构建应用程序,即使我使用的是 Sonoma 并且 Xcode 14.3.1 甚至不支持 Sonoma,但使用这个技巧我还是能够让它工作。这暂时解决了问题,但并不是真正的长期解决方案,因为在未来的某个时候,升级到更新的 Xcode 版本将不可避免。