我正在尝试使用Swift的软件包管理器来导入项目中的外部模块。我的第一个模块来自Vapor project。我似乎无法让它工作。我从
开始swift package init
swift package generate-xcodeproj
我的Package.swift看起来像这样:
import PackageDescription
let package = Package(
name: "OpenTools",
products: [
.library(
name: "OpenTools",
targets: ["OpenTools"]),
],
dependencies: [
.package(url: "https://github.com/vapor/json.git", from: "2.0.0")
],
targets: [
.target(name: "OpenTools", dependencies: ["JSON"]),
]
)
然后我跑
swift package update
swift package generate-xcodeproj # to regenerate with dependencies
然后尝试在我的主文件中导入JSON包
import JSON
模块在那里如下所示,但导入返回时出现No such module 'JSON'
错误。
有什么想法吗?
答案 0 :(得分:4)
如果我有足够的声誉,我会将此作为评论。 ;)
可能问题在于Xcode,因为它还不知道,JSON
存在,因为它还没有构建。只需构建项目(使用cmd-B
)即可轻松解决这个问题。使用生成的xcodeproj,Xcode应该知道它首先需要构建JSON
然后构建其余部分,因为JSON
被标记为目标的依赖项。
您可以通过在Xcode中导航到目标(当您单击项目描述文件时)以及之后的“构建阶段”来检查这一点。在Target Dependencies下,您应找到JSON
模块。
此外,您应该在目标下找到一个JSON
模块,它会编译您从github收集的来源。
您的项目也应该在项目根目录中执行swift build
时构建。
答案 1 :(得分:1)
使用Xcode 11,您应该可以直接打开#include "pch.h"
#include <iostream>
using namespace std;
template <typename Object>
class Collection {
public:
int ndx = 0;
Object *data[10] = { nullptr };
void insert(Object obj) {
if (ndx == 10) {
cout << "Container is full!!" << endl;
}
else {
data[ndx] = &obj;
//cout << data[ndx]->area() << endl;
++ndx;
cout << "Inserted in Location: " << ndx - 1 << endl;
}
}
void isEmpty() {
if (ndx > 0) {
cout << "Not empty " << ndx << " items!" << endl;
}
else {
cout << "Is empty, " << ndx << " items!" << endl;
}
}
void makeEmpty() {
for (int i = 0; i < ndx; i++)
data[i] = nullptr;
ndx = 0;
cout << "It is Empty!" << endl;
}
void remove(Object obj) {
cout << obj.area() << "here" << endl;
int index = -1;
for (int i = 0; i < ndx; i++) {
if (data[i] == obj) {
index = i;
}
}
if (index != -1) {
if (index == ndx - 1)
--ndx;
else {
for (int i = index; i < ndx; i++) {
data[i] = data[i + 1];
}
--ndx;
data[ndx] = nullptr;
}
cout << "Object Removed Location: " << index << endl;
}
else {
cout << "Object not found!" << endl;
}
}
bool contains(Object obj) {
for (int i = 0; i < ndx; i++) {
if (data[i] == obj) {
return true;
}
}
return false;
}
};
class Rec {
public:
int width;
int hieght;
void setValues(int &w, int &h) {
width = w;
hieght = h;
}
void setWidth(int &w) {
width = w;
}
void setHieght(int &h) {
hieght = h;
}
int area() { return width * hieght; };
bool operator==(const Rec& rhs)const {
cout << "used Normal" << endl;
return (width == rhs.width) && (hieght == rhs.hieght);
}
};
bool operator==(Rec * lhs, Rec rhs) {
cout << "used *" << endl;
return (lhs->width == rhs.width) && (lhs->hieght == rhs.hieght);
}
int main()
{
Collection<Rec> test;
for (int i = 0; i < 11; i++) {
Rec r;
r.setValues(i, i);
test.insert(r);
}
Rec r;
int i = 22;
r.setValues(i, i);
bool t = test.contains(r);
cout << "Here?: " << t << endl;
r.setValues(i, i);
test.remove(r);
test.makeEmpty();
//cout << test.data[6]->area() << endl;
return 0;
}
,这将为您验证软件包清单(aka:Package.swift
文件)和编译目标提供一个试验场。这应该有助于了解导致错误的实际原因,该错误阻止了模块的编译。