我一直在玩Swift并发现当向下投射一个要插入字典的对象时,我得到一个奇怪的警告:Treating a forced downcast to 'String' as optional will never produce 'nil'.如果我更换as,as?则警告消失.
func test() -> AnyObject! {
return "Hi!"
}
var dict = Dictionary<String,String>()
dict["test"]=test() as String
Run Code Online (Sandbox Code Playgroud)
Apple的文档说明如下
由于向下转换可能会失败,因此类型转换运算符有两种不同的形式.可选表单
as?将返回您尝试向下转换的类型的可选值.强制形式as尝试向下倾斜并强制将结果作为单个复合动作展开.
我不清楚为什么在这里使用as?而不是as正确的.一些测试显示,如果我更改test()以返回Int而不是String,如果我继续使用,代码将退出并出现错误as.如果我切换到使用as?那么代码将继续正常执行并跳过该语句(dict将保持为空).但是,我不确定为什么这是更可取的.在我看来,我宁愿程序退出并出现错误并让我知道演员表不成功然后只是忽略错误的声明并继续执行.
根据文档,我应该使用强制形式"只有当你确定转发将永远成功时".在这种情况下,我确信向下转换将永远成功,因为我知道test()只能返回一个字符串,所以我认为这是强制形式的向下转换的完美情况.那么为什么编译器会给我一个警告呢?
请考虑以下代码段:
var a: String? = "abc"
var b: String?
let result = [a, b].compactMap { $0 }
Run Code Online (Sandbox Code Playgroud)
执行后,result将会
["abc"]
Run Code Online (Sandbox Code Playgroud)
这是预期的结果.这里的result(ElementOfResult)元素是String.
print(type(of: result))
Array<String>
Run Code Online (Sandbox Code Playgroud)
现在到了有趣的部分.将代码段更改为
var a: String? = "abc"
var b: Int?
let result = [a, b].compactMap { $0 }
Run Code Online (Sandbox Code Playgroud)
并执行它,result将是
[Optional("abc"), nil]
Run Code Online (Sandbox Code Playgroud)
结果的元件(ElementOfResult)这里是Any这是有意义的,因为Any是的公分母String和Int.
print(type(of: result))
Array<Any>
Run Code Online (Sandbox Code Playgroud)
为什么nil返回的结果compactMap与其定义相矛盾?
来自Apple的compactMap 文档
compactMap(_ :)
返回一个数组,其中包含使用此序列的每个元素调用给定转换的非零结果.
宣言
func compactMap(_ transform:(Self.Element)throws …
我想知道以下情况是否真实?!
是否可以通过编程方式在iOS 7.0 Simulator上授予对本机地址簿(NAB)的访问权限?我正在编写需要对NAB进行写访问的xctest单元测试.单元测试在iOS 7.0 Simulator上运行,是Continuous Integration过程的一部分,不涉及任何用户交互.
目前,除非用户通过"TestApp"明确授予访问权限想要访问"联系人"警报,否则将拒绝访问NAB.
根据 Jest 文档
防止 Jest 同时执行超过指定数量的测试。只影响使用的测试
test.concurrent
指定工作池为运行测试而生成的最大工作人员数量
这两个参数之间有什么关系呢?设置时该--maxWorkers参数有影响吗--maxConcurrency=1?相反的情况怎么样——设置--maxConcurrency时有什么影响吗?--maxWorkers=1
问题摘要:相同的客户端 - 服务器配置,相同的网络拓扑,相同的设备(Bold 9900) - 在OS 7.0上运行良好,但在OS 7.1上无法正常工作,并且服务器在非常安全的tls连接后关闭短时间.
问题:OS 7.0和OS 7.1之间的安全tls连接打开是否应该有任何区别?RIM是否在7.1中改变了基础设施中的任何内容?在7.1中是否存在可能导致过早安全连接闭合的问题?
我的应用程序打开与服务器的安全tls连接.应用程序层保持活动机制保持连接,并保持打开状态,直到客户端关闭它.附件是实际代码的简化版本,它打开连接并从套接字读取.该代码在OS 5.0-7.0上运行良好,但在OS 7.1上无法正常工作.
在OS 7.1上运行时,阻塞在非常短的时间(10-45秒)后read()返回-1(已到达流的末尾).对于OS 5.0-7.0,调用将read()保持阻塞,直到下一个数据到达,并且服务器永远不会关闭连接.
Connection connection = Connector.open(connectionString);
connInputStream = connection.openInputStream();
while (true) {
try {
retVal = connInputStream.read();
if (-1 == retVal) {
break; // end of stream has been reached
}
} catch (Exception e ) {
// do error handling
}
// data read from stream is handled here
}
Run Code Online (Sandbox Code Playgroud)
更新1: …
我正在寻找Linux下用于C++的用户模式多线程库/框架.我熟悉boost :: thread和ACE_Thread_Manager,但AFAIK最终都使用OS本机线程的支持.
建议将受到高度赞赏.
即时编写一个应用程序,我已经创建了自定义列表字段来显示列表视图.我的CustomListField包含一行中的一个图像和文本.im gettiing字段更改监听器点击listfield行但我想把fieldchange监听器放在图像上..任何人都可以告诉我我该怎么做.
这是我的代码.
public class CustomListField extends ListField implements ListFieldCallback {
private Vector _listData;
private int _MAX_ROW_HEIGHT = 60;
public CustomListField(Vector data) {
_listData = data;
setSize(_listData.size());
setSearchable(true);
setCallback(this);
setRowHeight(_MAX_ROW_HEIGHT);
}
protected void drawFocus(Graphics graphics, boolean on) {
XYRect rect = new XYRect();
graphics.setGlobalAlpha(150);
graphics.setColor(Color.BLUE);
getFocusRect(rect);
drawHighlightRegion(graphics, HIGHLIGHT_FOCUS, true, rect.x, rect.y, rect.width, rect.height);
}
public int moveFocus(int amount, int status, int time) {
this.invalidate(this.getSelectedIndex());
return super.moveFocus(amount, status, time);
}
public void onFocus(int direction) {
super.onFocus(direction);
}
protected void onUnFocus() { …Run Code Online (Sandbox Code Playgroud) 我有一个要求改变AssemblyVersion新版本的要求.我是用java代码做的string.replaceAll(regexPattern,updatedString);
此代码适用于正常的正则表达式模式,但我无法在此模式中使用非捕获组.我想使用非捕获组来确保我不捕获非必需的模式.这是我试过的代码:
String str="[assembly: AssemblyVersion(\"1.0.0.0\")]";
str=str.replaceAll("(?:\\[assembly: AssemblyVersion\\(\"\\d\\.\\d\\.)?.*(?:\"\\)\\])?", "4.0");
System.out.println(str);
Run Code Online (Sandbox Code Playgroud)
在这里,我想匹配字符串[assembly: AssemblyVersion(int.int)]并仅替换次要版本.
预期的结果是[assembly: AssemblyVersion("1.0.4.0")],但我得到了结果4.04.0.
有人可以帮我这个吗?
我想inline cell用这里描述的Eureka
实现一个自定义.但是在我的具体案例中,我在编译时遇到了一些问题.当我尝试运行时出现以下错误,Swift编译器崩溃.
...
Call parameter type does not match function signature!
...
1. Running pass 'Module Verifier' on function'@_TWaC7TonyPro22ServiceCheckInlineRow26Eureka13InlineRowTypeS_'
...
Run Code Online (Sandbox Code Playgroud)
我可折叠的Row和Cell.
public final class ServiceRow: Row<Service, ServiceCell>, RowType {
...
}
public class ServiceCell: Cell<Service>, CellType {
...
}
Run Code Online (Sandbox Code Playgroud)
我的内联行
public class ServiceCheckInlineRow: ImageCheckInlineRow<Service>, InlineRowType {
public typealias InlineRow = ServiceRow
required public init(tag: String?) {
super.init(tag: tag)
onExpandInlineRow { cell, row, _ in
let color = cell.detailTextLabel?.textColor
row.onCollapseInlineRow { cell, _, _ in
cell.detailTextLabel?.textColor …Run Code Online (Sandbox Code Playgroud) 有这个功能
private func date(from string: String) {
// Do thing with string
}
Run Code Online (Sandbox Code Playgroud)
用它来调用时
let date = date(from: "11:30")
Run Code Online (Sandbox Code Playgroud)
它会产生以下错误
Variable used within its own initial value
显然将代码更改为
let anythingButDate = date(from: "11:30")
Run Code Online (Sandbox Code Playgroud)
将使错误消失,但我试图理解为什么变量名和方法名之间首先存在冲突.
更新:
更精确地说-我明白,编译器有问题与赋予变量和示例代码中的相同名称的功能,但我很好奇,为什么不能Swift编译器,一个区别是一个变量名,另一个是功能名称.
swift ×4
ios ×3
blackberry ×2
c++ ×2
java ×2
automation ×1
c ×1
compilation ×1
downcast ×1
eureka-forms ×1
ios7 ×1
javascript ×1
jestjs ×1
linux ×1
listfield ×1
optional ×1
regex ×1
sockets ×1
swift4.1 ×1
xctest ×1