我知道Swift包管理器可以从github编译代码作为我的项目的模块,但是我可以告诉包管理器编译本地存储在我的计算机上的代码吗?
我的想法是,我想要将一些代码与项目的其余部分分开,因此我将其保存在一个文件夹中,Swift编译器将构建它,以便可以像任何其他模块一样导入该代码.
这与此问题有关,假设使用生成器(迭代器)遍历嵌套数组将是迭代元素的最佳选择,只要您不需要存储结果,同时使用重复数组如果你只想平整阵列,串联是最好的.
但是,我决定做一些测试,并实现这个函数(用懒惰和存储形式展平[Any]包含Ints或[Int]s 的数组),结果表明存储的形式更快,即使只是用于迭代元素!这意味着,不知何故,迭代生成器比在内存中构造新数组花费更多的时间,然后迭代它.
令人难以置信的是,它甚至比同一程序的python实现慢约5-70%,随着输入的减少而恶化.斯威夫特是用-O旗帜建造的.
这里有三个测试用例1.小输入,混合; 2.大输入,[Int]显性,3.大输入,Int显性:
let array1: [Any] = [Array(1...100), Array(101...105), 106,
Array(107...111), 112, 113, 114, Array(115...125)]
let array2: [Any] = Array(repeating: Array(1...5), count: 2000)
let array3: [Any] = Array(repeating: 31, count: 10000)
Run Code Online (Sandbox Code Playgroud)
A1 = [list(range(1, 101)), list(range(101, 106)), 106,
list(range(107, 112)), 112, 113, 114, list(range(115, 126))]
A2 = list(range(1, 6)) * 2000
A3 = …Run Code Online (Sandbox Code Playgroud) 关于如何在Swift中创建生成器(或者在Swift中显然调用它们的迭代器)的指南很少,特别是如果您不熟悉该语言.为什么有这么多的发电机类型AnyIterator和UnfoldSequence?为什么下面的代码不应该从单个Ints或s的数组中产生Int?
func chain(_ segments: Any...) -> AnyIterator<Int>{
return AnyIterator<Int> {
for segment in segments {
switch segment {
case let segment as Int:
return segment
case let segment as [Int]:
for i in segment {
return i
}
default:
return nil
}
}
return nil
}
}
let G = chain(array1, 42, array2)
while let g = G.next() {
print(g)
}
Run Code Online (Sandbox Code Playgroud)
我理解它的方式,AnyIterator应该采取{}s中的闭包并将其转换.next()为返回的生成器中的方法,但它似乎不起作用.或者我应该UnfoldSequence像 …
显然python将允许我哈希生成器表达式,如 (i for i in [1, 2, 3, 4, 5])
>>> hash(i for i in [1, 2, 3, 4, 5])
8735741846615
Run Code Online (Sandbox Code Playgroud)
然而,仔细观察,无论我投入哪个生成器,这个哈希值总是相同的!
>>> hash(i for i in range(2))
8735741846615
>>> hash(i for i in [1, 2, 3, 4, 5, 6])
8735741846615
>>> hash(i for i in [0, 1, 2, 3, 4, 5, 6])
8735741846615
Run Code Online (Sandbox Code Playgroud)
为什么会这样?为什么甚至允许对发生器进行散列?
我需要这样做,因为我将东西存储在字典缓存中.您可以通过传递对象列表来访问缓存中的条目.但是,具有不同项目的某些列表组仍应指向相同的条目,因为此处唯一重要的是每个列表项中一个属性的整数值.因此,它们应仅基于这些整数值进行散列,而不是与项本身相关的任何内容,以避免不必要的缓存未命中.
我知道你总是可以将表达式转换为元组,但我问你是否可以通过简单地使用没有元组容器的生成器的输出来绕过它,类似于如何sum()用于这样的事情.
有没有办法在不创建git存储库的情况下在Swift项目中包含C库?这似乎是在Package Manager文档中解释的唯一方法.启动一个git repo只是为了包含一些已经在我的计算机上的C头看起来很笨重.
我尝试module.map在模块中使用文件,就像任何纯Swift模块一样,并且C模块导入正常,但不包含符号.
这是我的项目的样子:
Project
??? Package.swift
??? Sources
??? Project
? ??? main.swift
??? The_C_module_i_want
? ??? module.modulemap
? ??? Package.swift (empty, else it won’t compile)
??? Some_Swift_module
??? taylor.swift
Run Code Online (Sandbox Code Playgroud)
顶级Package.swift看起来像
import PackageDescription
let package = Package(name: "Project",
targets : [
Target(name: "Project",
dependencies: ["Some_Swift_module",
"The_C_module_i_want"]),
Target(name: "Some_Swift_module"),
Target(name: "The_C_module_i_want")
]
)
Run Code Online (Sandbox Code Playgroud)
模块映射如下所示:
module The_C_module_i_want {
header "/usr/local/include/The_C_library/the_c_library.h"
export *
link ...
link ...
...
}
Run Code Online (Sandbox Code Playgroud) 默认情况下,SPM 构建可执行目标,其名称与包含其main.swift. 如何使用不同的文件名构建二进制文件?我在SPM 手册上找不到任何说明。
我有一个3D点和一个中心的列表,我想围绕一个给定的法向矢量按(逆时针)顺序对它们进行排序。这些点不是共面的,但是它们和中心绑定到球体的表面,并且它们勾勒出多边形。法线向量是从球心到分类中心的向量。我尝试了此比较功能,但是当两点?/2之间的距离大于彼此时,它就会失败。
如何获得任意点的实际3D(逆时针)排序?
这不是按顺时针方向对球体表面上的3D点进行排序的重复,因为此问题专门用于解决角度比较中缺少传递性的问题。
这不是将3d共面点列表按顺时针或逆时针排序的重复,因为该问题更多地是关于确定一个点是否与另一个点更接近顺时针或逆时针,尽管这是一个比较关系,但它不会给出定义明确的总排序。
我想这是一个必须要求每种语言的问题,但是当你写作例如:
while i < array.count {
...
}
Run Code Online (Sandbox Code Playgroud)
确实array.count每个循环运行时间得到评估?let在运行这样的循环之前将它存储在常量中是否更好?
let length = array.count
while i < length {
...
}
Run Code Online (Sandbox Code Playgroud)