为什么这不起作用?
"abcdefg".characters.map(String.init) // error: type of expression is ambiguous without more context
Run Code Online (Sandbox Code Playgroud)
在Swift中我喜欢的一个非常酷的东西是能够通过传入一个init方法将一个东西的集合转换为另一个东西(假设存在init()for该类型).
这是一个将元组列表转换为实例的示例ClosedInterval.
[(1,3), (3,4), (4,5)].map(ClosedInterval.init)
Run Code Online (Sandbox Code Playgroud)
这个例子还利用了这样一个事实,即只要元组与函数的参数列表匹配,我们就可以将参数元组作为单个参数传递.
这是另一个例子,这次将数字列表转换为字符串实例.
(1...100).map(String.init)
Run Code Online (Sandbox Code Playgroud)
不幸的是,下一个例子不起作用.在这里,我试图将一个字符串拆分为单字符字符串列表.
"abcdefg".characters.map(String.init) // error: type of expression is ambiguous without more context
Run Code Online (Sandbox Code Playgroud)
map()应该在一个列表上运行Character(事实上,我能够在游乐场中验证Swift推断出正确的[Character]类型被传递到这里map).
String绝对可以从a实例化Character.
let a: Character = "a"
String(a) // this works
Run Code Online (Sandbox Code Playgroud)
有趣的是,如果角色各自都在自己的数组中,这就有效.
"abcdefg".characters.map { [$0] }.map(String.init)
Run Code Online (Sandbox Code Playgroud)
或等效的:
let cx2: [[Character]] = [["a"], ["b"], ["c"], ["d"]]
cx2.map(String.init)
Run Code Online (Sandbox Code Playgroud)
我知道我可以这样做:
"abcdefg".characters.map { String($0) }
Run Code Online (Sandbox Code Playgroud)
但我特意试着理解为什么"abcdefg".characters.map(String.init) …
我有一个离线的React Web应用程序,其中所有数据都本地存储在indexedDB中.除了托管静态资产的文件之外,没有其他服务器.我现在开始考虑使用redux,但我正在努力理解将更多数据移入商店并继续依赖数据库之间的权衡.使用带有redux的本地数据库的惯用方法是什么?
目前我的应用程序由几个容器组件组成,每个容器组件都从db中获取数据componentWillMount.集成redux的一个选项是保持这个大致相同,唯一的区别是状态保存在存储中,数据是使用动作和thunk获取的.
或者,我已经看到很多示例代码在启动时将所有数据加载到商店中.这使整个应用程序更具确定性,更易于测试和重现.主要组件之间的切换将立即发生(以初始应用程序负载为代价).但我失去了DB提供的好处,如索引和好查询.
看起来像是不合理地将整个数据库加载到商店中,至少在我的情况下,这将是大约10MB的数据,可能更多.所以我将至少有一些组件需要继续在mount上获取数据.但是有一个数据的子集是应用程序的核心,并且可以认为表应该完整地加载(这可能是大约5,000到10,000个对象).
使用本地存储和redux的惯用方法是什么?我觉得componentWillMount如果可以避免异步提取不是惯用的.即使在状态足够小以至于可以完全加载到商店的情况下,是否值得放弃高效查询界面的好处?
编辑:我应该提一下:我正在使用Dexie,这是一个非常非常好的库,用于处理indexedDB.它很快,有一个很好的查询界面,处理迁移等...我真的想继续使用Dexie,除非有一个非常强烈的理由不这样做.
作为参考,这里是关于Dexie的github的这个主题的讨论.一般的拿走形式是"它取决于".不是我想要的答案,所以我希望在可能的情况下获得更多的洞察力.
我试图将实体扩展为非实体,用于填充超类的字段.问题是,当我尝试保存它时,Hibernate会抛出MappingException.这是因为即使我将ReportParser强制转换为Report,运行时实例仍然是ReportParser,因此Hibernate抱怨它是一个未知实体.
@Entity
@Table(name = "TB_Reports")
public class Report
{
Long id;
String name;
String value;
@Id
@GeneratedValue
@Column(name = "cReportID")
public Long getId()
{
return this.id;
}
public void setId(Long id)
{
this.id = id;
}
@Column(name = "cCompanyName")
public String getname()
{
return this.name;
}
public void setName(String name)
{
this.name = name;
}
@Column(name = "cCompanyValue")
public String getValue()
{
return this.name;
}
public void setValue(String value)
{
this.value = value;
}
}
Run Code Online (Sandbox Code Playgroud)
ReportParser仅用于填写字段.
public class ReportParser extends …Run Code Online (Sandbox Code Playgroud) 对于通用标题很抱歉,如果没有示例,很难描述问题.
假设我定义了以下限制为Equatable类型的泛型函数:
func test<T: Equatable>(expect expected: T, run: () -> T) {
let value = run()
if value == expected {
print("OK")
} else {
print("Expected: \(expected), Actual: \(value)")
}
}
Run Code Online (Sandbox Code Playgroud)
这是使用所述函数的示例:
test(expect: 100) { 10 * 10 } // prints "OK"
test(expect: 1000) { 10 * 10 } // prints "Expected: 1000, Actual: 100"
Run Code Online (Sandbox Code Playgroud)
当然,我可以存储值而不是使用文字:
let e = 100
test(expect: e) { e } // prints "OK"
Run Code Online (Sandbox Code Playgroud)
到目前为止一切顺利,一切都按预期工作(没有双关语意).
现在让我们用一个数组来尝试:
test(expect: [1, 2]) { [1, 2] } // …Run Code Online (Sandbox Code Playgroud) 我有很多iOS经验,但Cocoa让我有些困惑.我阅读了几篇关于Cocoa的Apple文档,但仍然有一些我在任何地方都找不到的细节.看来文档是在基于NSDocument的Xcode模板更新为使用NSViewController之前编写的,所以我不清楚我应该如何组织我的应用程序.该模板使用NSWindow NSViewController创建一个故事板.
我的理解是我应该将NSWindowController或NSWindow子类化为对我的模型对象的引用,并在makeWindowControllers()中设置它.但是,如果我想使用NSViewController而不是只是将所有内容放在窗口中,我还需要以某种方式访问我的模型.我注意到在我的视图控制器中有一个叫做RepresentObject的东西,它似乎意味着要保存一些模型对象(然后被强制转换),但它总是为零.这是如何设置的?
我发现很难正确地提出这个问题,但我想我的问题是:如何在基于文档的应用程序中正确使用NSViewController?
PS:我知道NSWindowController通常用于管理多个窗口,这些窗口作用于一个文档,所以假设我只需要一个窗口,那么我就不需要NSWindowController.但是,要求可能会改变,从长远来看使用NSWindowController可能会更好,对吧?
cocoa nsdocument nsviewcontroller nswindowcontroller xcode-storyboard
苹果的文档建议使用WkWebView新的发展,但它似乎有一个错字它建议WKWebView在一个UIWebView在MAC开发库.
对于新开发,请使用此类而不是旧的UIWebView类.
错字可能是因为他们试图通过对两者使用相同的标题将OSX和iOS界面统一到Web视图.
但是,WKWebView没有WebViewOSX中的所有功能.例如,您可以访问本机接口中的DOM节点,WebView但我没有看到任何方法从Swift/Objective-C中执行此操作WKWebView.
出于我的目的,似乎WebView是我需要的,但我厌倦了启动一个依赖于将被删除的API的项目.但是,我没有看到任何提及WebView在标题或文档中的任何地方弃用的意图.
更令人困惑的是,WebKit框架参考引用了两个WK和较旧的Web视图API而没有澄清任何内容.
WKWebView
WKWebView对象显示交互式Web内容,例如应用程序内浏览器.
的WebView
WebView是WebKit框架中的核心视图类,用于管理WebFrame和WebFrameView类之间的交互.
是WebView要离开的OSX?
常见的建议是保持状态最小化并使用memoized选择器(如重选lib)来获取派生数据.我知道有些情况下将它放入商店是合适的.我的应用程序中有很多派生数据,生成起来有些昂贵,但由于其使用方式的性质,没有必要经常生成它.在什么时候数据太复杂,不适合选择器,应该放入商店?
更多细节:
我有时间序列数据,我运行一些计算来生成数据的派生"视图".每个视图中的记录都是根据之前的所有记录计算得出的.
提供一个更具体,有点人为的例子:
目前我在没有redux的indexedDB中做这一切.
我有一个主表纯粹是用户输入:
type Earnings = {
id: number;
time: Date;
amount: number;
category: 'A' | 'B' | 'C' | 'D';
};
Run Code Online (Sandbox Code Playgroud)
我有一堆钩子,当Earnings数据发生变化时会生成"视图"表.
type EarningsByDay = {
id: number;
date: Date; // only used to date part
amountTotal: number;
maxToDate: number;
};
type EarningsByDateAndCategory = {
id: number;
date: Date; // only used to date part
category: 'A' | 'B' | 'C' | 'D';
amountTotal: number;
maxToDate: number;
};
Run Code Online (Sandbox Code Playgroud)
在上面的视图中,通过从小于当前项的日期的所有记录中查找最大值来计算maxToDatefor .同样地.EarningsByDayamountTotal …