我有一个Swift框架,我们编译并分发给第三方开发人员.我想在项目中包含一些C代码,但是我能够使它工作的唯一方法是将C头导入我的框架头并将C头设置为public.这会将所有C代码暴露给第三方开发人员,这不是我们想要的.
我在网上可以找到的有关如何执行此操作的所有内容都是此方法的变体:https://spin.atomicobject.com/2015/02/23/c-libraries-swift/
但是这个方法的警告是"注意,使用这种技术构建的任何框架的消费者也必须将模块添加到他们的Swift搜索路径中." 我们已经尝试了这一点,当然我们的第三方开发人员得到的错误Missing required module 'CGeodesic'是我们定义的指向C头的模块.
我们如何才能将C代码直接编译到我们的框架中,同时保持代码私有,并且不要求第三方开发人员更改其构建设置以使其工作?我不介意在我们的项目中设置这些子模块,但在一天结束时我希望它直接编译成单个平面框架二进制文件,没有动态链接或搜索路径或类似的东西.
编辑
该项目是与Swift代码并排的C代码.我的项目中有一个子目录,如下所示:
Swift文件包装C代码,使其更清晰.我在该目录中也有一个module.modulemap文件,但就像我之前说过的那样不起作用.我宁愿保持C代码与我的Swift代码并排,但我愿意放弃它以解决这个问题.
我正在研究ASP.NET MVC 4 Web应用程序.我正在使用.NET 4.5,并试图利用新的异步API.
我有几种情况,我想安排一个异步任务以便稍后运行,而我立即返回一个立即重要的值.例如,这是一个"登录"方法,我希望尽快返回一个新的SessionID,但是一旦我返回了SessionID,我想清除旧的过期SessionID:
public async Task<Guid> LogIn(string UserName, string Password)
{
//Asynchronously get ClientID from DB using UserName and Password
Session NewSession = new Session()
{
ClientID = ClientID,
TimeStamp = DateTime.Now
};
DB.Sessions.Add(NewSession);
await DB.SaveChangesAsync(); //NewSession.ID is autopopulated by DB
CleanSessions(ClientID); //Async method which I want to execute later
return NewSession.ID;
}
private async void CleanSessions(int ClientID)
{
//Asynchronously get expired sessions from DB based on ClientID and mark them for removal
await DB.SaveChangesAsync();
}
Run Code Online (Sandbox Code Playgroud)
我尝试了很多不同的东西,包括Task.Run()和Parallel.Invoke()的组合,但是CleanSessions永远不会被调用.如何实现后台任务调度?
通常我想要实现的目标:我们的地图数据历史上都是2D,我们使用的坐标系是左上角的原点(0,0),正x向右,正y向下.我们现在通过添加z轴,从屏幕出来的正z向您添加3D数据(想想自上而下的地图视图).这是一个左手坐标系,但SceneKit是一个右手坐标系.我想在SceneKit场景的顶层应用一些变换,它将场景转换为左手坐标系,这样我就可以根据自定义贴图坐标系修改/定位/添加节点到场景中.工作.
到目前为止我有这个:
let scene = SCNScene()
let cameraNode = SCNNode()
cameraNode.camera = SCNCamera()
cameraNode.scale = SCNVector3(1,-1,1)
scene.rootNode.addChildNode(cameraNode)
Run Code Online (Sandbox Code Playgroud)
这实现了我想要的,但有一个大问题.它会反转所有几何面,所以除非我更改材质的cullMode,否则我的几何体会消失:
let mapLength = 1000 //max X axis
let mapWidth = 800 //max Y axis
let mapHeight = 100 //max Z axis
cameraNode.position = SCNVector3(mapLength / 2, mapWidth / 2, 2000)
let mapPlane = SCNNode()
mapPlane.position = SCNVector3(mapLength / 2, mapWidth / 2, 0)
mapPlane.geometry = SCNPlane(width: mapLength, height: mapWidth)
mapPlane.geometry?.firstMaterial?.diffuse.contents = UIColor.blackColor()
scene.rootNode.addChildNode(mapPlane)
Run Code Online (Sandbox Code Playgroud)
mapPlane根本不显示!您必须将相机旋转mapPlane到底部才能看到它.您可以通过添加一行来轻松解决此问题:
mapPlane.geometry?.firstMaterial?.cullMode = .Front
Run Code Online (Sandbox Code Playgroud)
但我不想为每个几何/材料更改cullMode.有没有办法在不需要每个几何/材料的额外代码的情况下实现这一目标?对于rootNode的所有子节点,有些转换会反转几何面正常吗?理想情况下,这完全可以通过实际场景上的设置,或通过rootNode或摄像机上的变换来实现.
我在我的客户端Web应用程序上使用js-scrypt(https://github.com/tonyg/js-scrypt)来哈希和盐密码,然后将它们发布到我的服务器端.NET MVC应用程序进行哈希处理再次腌制.此JavaScript库将字节数组实现为JavaScript Uint8Arrays.如何让我的MVC控制器将我的JSON Uint8Array反序列化为byte []?
JavaScript示例:(AJAX.Post是我写的库,myUint8Array正确序列化)
AJAX.Post('www.example.com/SendByteArray', { myByteArray: myUint8Array }, Callback);
Run Code Online (Sandbox Code Playgroud)
C#示例:(在我的默认控制器中)
[HttpPost]
public async Task<JsonResult> SendByteArray(byte[] myByteArray) {
}
Run Code Online (Sandbox Code Playgroud)
在此示例中,myByteArray始终为null.我尝试了几种不同的方法,基于转换为字符串,然后返回到byte [],但我无法获得正确的值.如果我能够以某种方式直接将代码实现到.NET的JSON解串器中以便上面的代码完全按原样工作,那将是非常优选的,因为我有一些其他项目,如果我可以直接传递字节数组,我可以做一些很酷的事情服务器端和客户端应用程序.
我正在尝试实现一些可以使用JSON数据初始化的类[String : AnyObject].对于这个用例,可用的初始值设定项似乎是完美的,但我似乎无法正确获取语法(不会创建丑陋的代码).
可以这样做吗?:
class Person {
let firstName: String
let middleName: String?
init?(JSONData data: [String : AnyObject]) {
do {
try {
self.firstName = data["firstName"] as! String
self.middleName = data["middleName"] as? String
}
} catch {
return nil
}
}
}
Run Code Online (Sandbox Code Playgroud) 假设我有一个如下通用接口:
interface Transform<ArgType> {
transformer: (input: string, arg: ArgType) => string;
arg: ArgType;
}
Run Code Online (Sandbox Code Playgroud)
然后我想将这些数组Transform应用于一个string。我如何定义这样的数组,Transform以使其<ArgType>在Transform.transformer和中都等效Transform.arg?我想写这样的东西:
function append(input: string, arg: string): string {
return input.concat(arg);
}
function repeat(input: string, arg: number): string {
return input.repeat(arg);
}
const transforms = [
{
transformer: append,
arg: " END"
},
{
transformer: repeat,
arg: 4
},
];
function applyTransforms(input: string, transforms: \*what type goes here?*\): string {
for (const transform of transforms) …Run Code Online (Sandbox Code Playgroud) swift ×3
.net-4.5 ×1
3d ×1
async-await ×1
c ×1
c# ×1
generics ×1
javascript ×1
llvm ×1
opengl ×1
scenekit ×1
typescript ×1
xcode ×1