小编Jay*_*ske的帖子

如何测试Swift枚举与相关值的相等性

我想测试两个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一样.

swift

174
推荐指数
8
解决办法
7万
查看次数

如何将片段声明为隐藏在XML布局中

我的活动在单个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()以供参考.

xml android fragment

14
推荐指数
3
解决办法
1万
查看次数

如何将负整数转换为SML中的字符串,使用减号而不是波浪号?

标准SML库函数Int.toString前缀为负数~而不是-.是否有一个库函数可供使用-,缺少写作

fun i2s i =
    if i < 0 then "-" ^ Int.toString (~i) else Int.toString i
Run Code Online (Sandbox Code Playgroud)

sml smlnj

13
推荐指数
1
解决办法
5215
查看次数

使用Flex/Bison进行口译的REPL

我为类似C语言编写了一个解释器,使用Flex和Bison作为扫描器/解析器.它在执行完整的程序文件时工作正常.

现在我正在尝试在解释器中实现REPL以进行交互式使用.我希望它像Ruby或ML中的命令行解释器一样工作:

  1. 显示提示
  2. 接受该行的一个或多个陈述
  3. 如果表达式不完整
    1. 显示继续提示
    2. 允许用户继续输入行
  4. 当该行以完整表达结束时
    1. 回显评估最后一个表达式的结果
    2. 显示主要提示

我的语法从一个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.)

c lex bison read-eval-print-loop flex-lexer

10
推荐指数
1
解决办法
1904
查看次数

自动为已编译的模块生成Swift接口

从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声明的新方法?

swift

8
推荐指数
1
解决办法
1301
查看次数

如何在Objective-C++ std :: map中使用NSString作为键

我正在开始一个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<吗?

stl objective-c++

7
推荐指数
1
解决办法
2110
查看次数

如何在UITextField中为占位符文本设置辅助功能特征?

我正在浏览我们的iOS应用程序以修复可访问性问题.该应用程序的一个功能是UITextField,用户可以在其中输入搜索查询.我已将该字段的特征设置为"搜索字段",而VoiceOver在大多数情况下都可以很好地处理该字段.当字段中有文本时,它会读取文本,然后显示"搜索字段".

我想解决的问题是VoiceOver如何处理占位符文本.当文本字段为空时,我们设置占位符文本以显示示例查询.由于它显示为灰色文本,因此有视力的用户可以看到它只是占位符文本.但VoiceOver并没有为视障用户做出这样的区分.它只是以与常规文本相同的方式读取占位符文本,没有额外的描述.

有没有办法为UITextField的占位符文本添加辅助功能特征?或者让人们通过其他方式解决这个问题?

uitextfield ios voiceover

6
推荐指数
1
解决办法
3781
查看次数

如何测试命名元组的Swift数组的相等性

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

6
推荐指数
1
解决办法
1561
查看次数

在Swift中调用目标操作

在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.还有其他任何调用动作的技巧吗?

swift

5
推荐指数
1
解决办法
5804
查看次数

如何使用 Safari 在我的 Mac 应用程序中调试 WKWebView?

我正在开发一个使用 WKWebView 来显示 HTML 资源的 Mac 应用程序。我想使用 Safari 检查器来调试应用程序中的 JavaScript。

\n\n

当我通过从 Xcode 启动应用程序来调试它时,Safari 不会在“开发”菜单 \xe2\x80\x94 中显示我的应用程序,它显示“没有可检查的应用程序”。

\n\n

如何让我的 Mac 应用程序出现在 Safari 的“开发”菜单中?

\n

safari macos

5
推荐指数
2
解决办法
5487
查看次数