我完全清楚Swift没有try/catch机制来捕获异常(好的,Swift 2.0现在支持它们).我也理解许多API方法会返回一个NSError,如果出现问题,它将填充错误对象.所以请不要指出这个问题:Swift语言中的错误处理
但是这仍然没有解释如何对自己的代码中的运行时错误作出反应,例如数组越界访问或强制解包一个nil的可选值.例如:
var test: String?
test = nil
println(test!) //oops!
Run Code Online (Sandbox Code Playgroud)
要么
var arr = [0,1,2]
for i = 0...3 {
println(arr[i]) //oops!
}
Run Code Online (Sandbox Code Playgroud)
每个程序员偶尔会犯这样的错误,应该有一种方法至少记录它们以供以后分析.在调试时,Xcode可以向我们展示这些,但如果最终用户或beta测试人员遇到这种情况怎么办?在纯C中有信号处理,它也可以在Objective-C中使用.在Swift中有这样的东西吗?在应用程序死亡之前输入的集中回调?
更新:
让我重新解释一个问题:在一个大项目中,在每个循环和强制解包时手动检查上述错误是不可行的.当运行时错误最终确实发生时,是否会有一个回调,比如Objective C的segfault处理或NSSetUncaughtExceptionHandler,它会被调用,以便错误可以与崩溃的堆栈跟踪一起记录/通过电子邮件发送?
鉴于形式
System.Windows.Forms::Form Form1;
Run Code Online (Sandbox Code Playgroud)
和窗口句柄
HWND hWnd;
Run Code Online (Sandbox Code Playgroud)
我如何将hWnd设置为Form1的Handle属性,该属性确实作为公共属性存在"获取控件绑定的窗口句柄.(继承自Control.)"根据System.Windows.Forms的Microsoft文档::表格?在Form Form1的构造函数中,我试过了
hWnd = this.Handle;
Run Code Online (Sandbox Code Playgroud)
但编译器抱怨:
错误C2228:'.Handle'的左边必须有class/struct/union类型是'MyNamespace :: Form1 ^ const'你打算用' - >代替吗?
所以我试试
hWnd = this->Handle;
Run Code Online (Sandbox Code Playgroud)
只是
hWnd = Handle; // Since I'm in the Form
Run Code Online (Sandbox Code Playgroud)
然后编译器说:
错误C2440:'=':无法从'System :: IntPtr'转换为'HWND'没有可用于执行此转换的用户定义转换运算符,或者无法调用运算符
我在网上广泛搜索但没有找到一个好的解释.
我的问题非常简单.
我有一个DLL,它有一个名为Initialize的函数,其中一个参数是一个指针,它将接收一个句柄,用于后续调用.另一个参数是一个字符串,我将列出完整性.我正在使用的签名是(简单形式):
[DllImport(MyDll)]
static extern bool Initialize([In] string name, out IntPtr handle);
Run Code Online (Sandbox Code Playgroud)
DLL本身的签名写为:Initialize(LPTSTR name, HANDLE handle)
注释"HANDLE:指向将接收句柄的位置".
随后的电话采取的形式
[DllImport(MyDll)]
static extern bool DoSomething(IntPtr handle, uint randomParameter);
Run Code Online (Sandbox Code Playgroud)
我一直在阅读SafeHandle
,我想知道我是否可以用它来替代我的IntPtr句柄.如果可以的话,我该怎么做?扩展抽象的SafeHandle类不是问题,但我可以直接用IntPtr替换SafeHandle(并使用默认编组)或者我是否需要做一些额外的事情?
using namespace std;
Run Code Online (Sandbox Code Playgroud)
考虑实体/对象管理的传统OOP方法:
struct Entity { bool alive{true}; }
struct Manager {
vector<unique_ptr<Entity>> entities; // Non cache-friendly
void update() {
// erase-remove_if idiom: remove all !alive entities
entities.erase(remove_if(begin(entities), end(entities),
[](const unique_ptr<Entity>& e){ return !e->alive; }));
}
};
struct UserObject {
// Even if Manager::entities contents are re-ordered
// this reference is still valid (if the entity was not deleted)
Entity& entity;
};
Run Code Online (Sandbox Code Playgroud)
但是,我想尝试一种面向数据的方法:不动态分配Entity
实例,而是将它们存储在缓存友好的线性内存中.
struct Manager {
vector<Entity> entities; // Cache-friendly
void …
Run Code Online (Sandbox Code Playgroud) 我正在构建一个应用程序给另一个应用程序mainWindowhandle它收集有关窗口状态的信息.我收集有关子窗口的信息没有问题,但我无法访问应用程序的其他打开窗口甚至菜单.有没有办法获取应用程序的所有窗口句柄?
如果我声明一个对象是句柄classdef的子类obj <handle我的对象现在基本上是某个某处内存的"指针".如何找出对象耗尽的内存量?
例如,假设我有一个带字段栏的类foo
classdef foo < handle
properties
bar = randn(1000);
end
Run Code Online (Sandbox Code Playgroud)
bar需要8兆字节(8字节*100万个数字)
但如果我输入
obj = foo();
whos('obj');
Run Code Online (Sandbox Code Playgroud)
我明白了
Name Size Bytes Class Attributes
obj 1x1 60 foo
Run Code Online (Sandbox Code Playgroud)
我如何找出obj指向的总内存量?
我正在尝试添加一个视图作为按钮的子视图,就像这样(btn1
是UIButton
);
[self.btn1 addSubview:view1];
Run Code Online (Sandbox Code Playgroud)
添加后,按钮不会提供任何与触摸相关的事件,按钮工作正常,不添加此子视图.
有什么想法吗?
我有一个通过httplib
使用连接到URL的功能lxml
.它检查xpath
某个模式,如果检查结果是肯定的,则返回一个字符串.但如果检查结果为否定,则不返回任何内容.
现在的情况是,我的函数返回None
.我调用该函数,检查它的返回值是否为not None
并继续在代码中.
一个例子:
def foobar(arg):
# connect to page by httplib
# check for arg in a certain pattern by lxml
if check:
return result
else:
return None
result = foobar(arg)
if result:
# do stuff
else:
# do other stuff
Run Code Online (Sandbox Code Playgroud)
最近我读到,这是不行的.我该如何避免这种情况?
我无法解决这个问题.我收到一个错误:
The name 'hWnd' does not exist in the current context
Run Code Online (Sandbox Code Playgroud)
这听起来很容易,可能是...对于提出如此明显的问题感到抱歉.
这是我的代码:
public static IntPtr WinGetHandle(string wName)
{
foreach (Process pList in Process.GetProcesses())
{
if (pList.MainWindowTitle.Contains(wName))
{
IntPtr hWnd = pList.MainWindowHandle;
}
}
return hWnd;
}
Run Code Online (Sandbox Code Playgroud)
我尝试了许多不同的方法,每个都失败了.提前致谢.
当按下文本字段时,我正在移动视图,以便在键盘出现时获得正确的视图.现在,当按下完成键盘按钮时,我想将视图返回到其初始状态.按下完成键盘按钮后如何处理操作?