我想测试两个Swift枚举值的相等性.例如:
enum SimpleToken {
case Name(String)
case Number(Int)
}
let t1 = SimpleToken.Number(123)
let t2 = SimpleToken.Number(123)
XCTAssert(t1 == t2)
Run Code Online (Sandbox Code Playgroud)
但是,编译器不会编译相等表达式:
error: could not find an overload for '==' that accepts the supplied arguments
XCTAssert(t1 == t2)
^~~~~~~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)
我是否已经定义了我自己的等于运算符的重载?我希望Swift编译器能够自动处理它,就像Scala和Ocaml一样.
我的活动在单个XML布局中声明其所有GUI片段.它只需要在发布时显示一些片段; 当用户与应用程序交互时,其余部分会显示.布局的一部分如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<fragment
android:id="@+id/map_panel"
android:name="com.example.MapPanel"
android:layout_width="match_parent"
android:layout_height="@dimen/map_panel_height" />
<fragment
android:id="@+id/list_panel"
android:name="com.example.ListPanel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/map_panel" />
<fragment
android:id="@+id/detail_panel"
android:name="com.example.DetailPanel"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/map_panel"
android:visibility="gone" />
Run Code Online (Sandbox Code Playgroud)
我的意图是list_panel片段在启动时可见,并且detail_panel片段被隐藏,直到用户从列表中选择某些内容.
默认情况下,片段以isHidden属性false 开头.这意味着我的活动必须遍历加载的片段并在启动时手动调用isHidden(true)片段detail_panel.
我更愿意isHidden在XML布局中声明状态.但是,设置android:visibility="gone"在一个<fragment>声明中不改变isHidden现状,我无法找到上会做的伎俩另一个属性的任何文件.
是否可以在a上设置XML属性<fragment>以使其隐藏?
注意:我不关心视图可见性,我关心的是fragment.isHidden()值.这会影响FragmentManager如何操纵后台堆栈并执行动画.如果调用transaction.show(fragment)视图不可见或不存在的片段,但fragment.isHidden()值为false,则FragmentManager不会使视图可见.请参阅http://developer.android.com/reference/android/app/Fragment.html#isHidden()以供参考.
标准SML库函数Int.toString前缀为负数~而不是-.是否有一个库函数可供使用-,缺少写作
fun i2s i =
if i < 0 then "-" ^ Int.toString (~i) else Int.toString i
Run Code Online (Sandbox Code Playgroud) 我为类似C语言编写了一个解释器,使用Flex和Bison作为扫描器/解析器.它在执行完整的程序文件时工作正常.
现在我正在尝试在解释器中实现REPL以进行交互式使用.我希望它像Ruby或ML中的命令行解释器一样工作:
我的语法从一个top_level生产开始,它代表了该语言中的一个语句.词法分析器配置为stdin上的交互模式.我在全文件和REPL模式下使用相同的扫描器和语法,因为两个接口没有语义差异.
我的主要评估循环是这样构建的.
while (!interpreter.done) {
if (interpreter.repl)
printf(prompt);
int status = yyparse(interpreter);
if (status) {
if (interpreter.error)
report_error(interpreter);
}
else {
if (interpreter.repl)
puts(interpreter.result);
}
}
Run Code Online (Sandbox Code Playgroud)
除了提示和回显逻辑之外,这种方法很好.如果用户在一行上输入多个语句,则此循环将打印出多余的提示和表达式.如果表达式在多行上继续,则此代码不会打印出连续提示.出现这些问题是因为提示/回显逻辑的粒度是top_level语法中的一个语句,但是行读取逻辑在词法分析器中很深.
重构评估循环以处理REPL提示和回显的最佳方法是什么?那是:
(我宁愿不改变扫描仪语言来传递换行标记,因为这会严重改变语法.修改YY_INPUT和添加一些动作到Bison语法会很好.而且,我使用的是Flex 2.5.35和与Xcode一起发货的Bison 2.3.)
从Swift的第一个测试版开始,我们已经能够通过交互过程看到模块的Swift接口.首先在Xcode项目中使用Swift文件,右键单击符号,然后选择"跳转到定义"; Xcode将生成带声明的文件.
这个程序有点乏味.这是非常手动的; 你必须从Xcode项目中的Swift文件开始; 你必须提前知道符号的名称.它不会生成模块中的所有声明 - 如果模块是在Objective-C中定义的,它只显示来自单个.h文件的声明.
我通过http://www.jpsim.com/uncovering-sourcekit/了解了Beta 3中的命令行工具swift-ide-test .通过使用如下命令,我可以生成整个框架的声明:
xcrun swift-ide-test -print-module -source-filename /dev/null \
-sdk /Applications/Xcode6-Beta.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk \
-print-regular-comments -module-print-submodules -module-to-print CoreGraphics
Run Code Online (Sandbox Code Playgroud)
但是,在Beta 4中,swift-ide-test命令已经消失.
有谁知道通过命令行自动生成Swift声明的新方法?
我正在开始一个Objective-C++项目的工作,在我做任何重型设计之前,先了解这两种语言的合成方式.我对自动引用计数如何与C++集成非常感兴趣:我们NSObjects在STL容器中得到了相应的智能指针,用于保存/释放句柄(参见David Chisnall在http://www.informit.com/articles上的文章)/article.aspx?p=1745876&seqNum=3).
我想使用STL映射作为从NSStringsC++值的类型安全映射.我可以将映射声明为
std::map<NSString*, MyType> mapping
Run Code Online (Sandbox Code Playgroud)
使用ARC,此映射可以正确处理内存管理.但它没有NSString正确地遵循值语义,因为它使用指针比较而不是-[NSString compare:].
使STL映射使用字符串比较而不是指针比较的最佳方法是什么?
我应该尝试专攻std::less<NSString*>吗?
我应该声明一个明确的比较器std::map<NSString*, MyType, MyCompare>吗?
我应该将NSString*键包装在一个实现的智能指针中operator<吗?
我正在浏览我们的iOS应用程序以修复可访问性问题.该应用程序的一个功能是UITextField,用户可以在其中输入搜索查询.我已将该字段的特征设置为"搜索字段",而VoiceOver在大多数情况下都可以很好地处理该字段.当字段中有文本时,它会读取文本,然后显示"搜索字段".
我想解决的问题是VoiceOver如何处理占位符文本.当文本字段为空时,我们设置占位符文本以显示示例查询.由于它显示为灰色文本,因此有视力的用户可以看到它只是占位符文本.但VoiceOver并没有为视障用户做出这样的区分.它只是以与常规文本相同的方式读取占位符文本,没有额外的描述.
有没有办法为UITextField的占位符文本添加辅助功能特征?或者让人们通过其他方式解决这个问题?
Swift元组不是Equatable,而作为复合类型,它们不能通过协议扩展来制作Equatable.解决方法(如另一个答案中所述)是==为每个元组元素为操作符创建重载.
有趣的是,可以将==运算符声明为常规元组,并使用它来将元组与命名字段进行比较:
func ==<T1: Equatable, T2: Equatable>(lhs: (T1,T2), rhs: (T1,T2)) -> Bool {
return lhs.0 == rhs.0 && lhs.1 == rhs.1
}
var one = ("One", 1)
let two = ("Two", 2)
print(one == two) // "false"
typealias NamedTuple2 = (name: String, value: Int)
var namedone: NamedTuple2 = (name: "One", value: 1)
let namedtwo: NamedTuple2 = (name: "Two", value: 2)
print(namedone == namedtwo) // "false"
print(namedone == one) // "true"
Run Code Online (Sandbox Code Playgroud)
元组数组也需要自定义重载作为整体进行比较:
func ==<T0: Equatable, …Run Code Online (Sandbox Code Playgroud) 在Swift中,如何使用在运行时确定的选择器执行Cocoa目标操作模式?
手头的细节:我的代码收到一个UIBarButtonItem,它需要调用按钮代表的动作.在Objective-C中,它很简单:
UIBarButtonItem* button = ...;
[button.target performSelector: button.action withObject: self];
Run Code Online (Sandbox Code Playgroud)
在Swift中,performSelector:不会因类型/内存安全原因而暴露.我无法创建一个Swift闭包,因为我在编译时不知道button.action.还有其他任何调用动作的技巧吗?
我正在开发一个使用 WKWebView 来显示 HTML 资源的 Mac 应用程序。我想使用 Safari 检查器来调试应用程序中的 JavaScript。
\n\n当我通过从 Xcode 启动应用程序来调试它时,Safari 不会在“开发”菜单 \xe2\x80\x94 中显示我的应用程序,它显示“没有可检查的应用程序”。
\n\n如何让我的 Mac 应用程序出现在 Safari 的“开发”菜单中?
\n