当我写一个Swift开关语句时,它会缩进代码,如下所示:
switch foo {
case 1:
// stuff happens
default:
// other stuff happens
}
Run Code Online (Sandbox Code Playgroud)
我希望它像这样缩进:
switch foo {
case 1:
// stuff happens
default:
// other stuff happens
}
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?我可以在这个主题上找到的所有问题都指向插件(不再适用于最新版本的Xcode)或者讨论哪种方式是"正确的"而不是提供改变它的方法.
在一个Angular应用程序中,我通过将它们全部推送到一个数组中来管理我的订阅,然后循环遍历它并取消订阅ngOnDestroy.
private subscriptions: Subscription[] = []
this.subscriptions.push(someObservable.subscribe(foo => bar))
Run Code Online (Sandbox Code Playgroud)
我的问题是我还没有找到足够干净的方法来处理取消订阅.理想的方式很简单
ngOnDestroy () {
this.subscriptions.forEach(subscription => subscription.unsubscribe())
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用.值得注意的是,我在注销后仍然收到Firebase权限错误("工作"方法不会发生这种情况).有趣的是,如果我把它拉到一个单独的类中,完全相同的方法确实有效:
export class Utils {
public static unsubscribeAll (subObject: {subscriptions: Subscription[]}) {
subObject.subscriptions.forEach(subscription => subscription.unsubscribe())
}
}
// ---------- back to the component
ngOnDestroy () {
Utils.unsubscribeAll({subscriptions: this.subscriptions}) // no Firebase errors
}
Run Code Online (Sandbox Code Playgroud)
但我真的不喜欢这个解决方案,主要是因为它只有在我将数组包装在一个对象中才能作为参考传递.我发现的另一种工作方法是将其写为for循环:
ngOnDestroy () {
/* tslint:disable */
for (let i = 0; i < this.subscriptions.length; i++) {
this.subscriptions[i].unsubscribe()
}
/* tslint:enable */
}
Run Code Online (Sandbox Code Playgroud)
但除了不必要的长度之外,它还会使TSLint抱怨,因为它认为我应该使用for-of循环(这不起作用)所以我每次都要抛出额外的注释.
目前我正在使用Utils选项作为"最佳"解决方案,但我仍然不满意.是否有一种更清洁的方式来做到这一点,我错过了?
我有一个按钮,当点击它时,它会被一个输入字段和一个确认按钮替换,然后当输入完成时,它会再次被原始按钮替换。发生这种情况时,我希望它在原始按钮出现后将其聚焦(一些用户要求更好地支持选项卡导航),但我似乎无法始终如一地做到这一点。我能做的最好的是:
// component.html
<button #durationButton *ngIf="!enteringDuration" (click)="enterDuration()">Enter Duration</button>
<ng-container *ngIf="enteringDuration">
<input type="number" [(ngModel)]="duration" (keyup.enter)="setDuration()">
<button (click)="setDuration()">✓</button>
</ng-container>
Run Code Online (Sandbox Code Playgroud)
// component.ts
@ViewChild("durationButton") durationButton: ElementRef
duration: number
enteringDuration = false
shouldFocusDurationButton = false
ngAfterContentChecked () {
if (this.shouldFocusDurationButton && this.durationButton) {
this.shouldFocusDurationButton = false
this.durationButton.nativeElement.focus()
}
}
enterDuration () {
this.enteringDuration = true
}
setDuration () {
this.enteringDuration = false
this.shouldFocusDurationButton = true
}
Run Code Online (Sandbox Code Playgroud)
如果我在确认按钮上单击或按下 Enter,焦点会在原始按钮出现后立即移动到原始按钮,但是如果我在输入字段中按下 Enter,按钮就会出现,但由于某种原因,在我移动鼠标之前它不会获得焦点. 我如何让它立即对两者都起作用?
假设我有一个带有关联值的枚举案例,以及该枚举类型的两个变量:
enum MyEnum {
case foo, bar(_ prop: Int)
}
let var1 = MyEnum.foo
let var2 = MyEnum.bar(1)
Run Code Online (Sandbox Code Playgroud)
如果我想检查两个变量是否与关联值的一般情况匹配,我可以用逗号来做:
if case .bar = var1, case .bar = var2 {
print("both are bar")
}
Run Code Online (Sandbox Code Playgroud)
但是,我需要检查,如果两种情况相匹配,像这样的东西:
if case .bar = var1 || case .bar = var2 {
print("at least one is bar")
}
Run Code Online (Sandbox Code Playgroud)
但是,这不编译.是否有另一种方法来编写这个以使逻辑工作?
我正在尝试处理一个JSON对象,使用一个guard语句来展开它并转换为我想要的类型,但该值仍然被保存为可选项.
guard let json = try? JSONSerialization.jsonObject(with: data) as? [String:Any] else {
break
}
let result = json["Result"]
// Error: Value of optional type '[String:Any]?' not unwrapped
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么吗?
我刚刚从RxJS 5升级到6,并使用迁移工具更新了我的代码:
rxjs-5-to-6-migrate -p tsconfig.json
在结果的最后,我得到了一系列这样的消息:
警告:/ path/to/file.ts [3,1]:重复RxJS导入
据我所知,这个警告出现在我的项目中从rxjs导入多个东西的每个文件中(例如import {Observable, BehaviorSubject} from "rxjs").该迁移指南有多个进口作为一个例子,所以我认为应该罚款.Google搜索仅返回警告消息的单个结果,并且似乎没有解决相同的问题(没有任何文件具有任何已弃用的导入).
这是什么意思,有什么值得担心的吗?
每当我创建一个 WKWebView 对象时,我突然开始在控制台中收到一系列我过去从未见过的消息:
WF: === Starting WebFilter logging for process MyApp
WF: _userSettingsForUser : (null)
WF: _WebFilterIsActive returning: NO
Run Code Online (Sandbox Code Playgroud)
即使我只是初始化对象而不对其进行任何操作,并在表明在 init 方法期间生成消息后立即设置断点,也会发生这种情况:
_ = WKWebView(frame: UIScreen.main.bounds)
/* breakpoint here, messages are already in the console */
Run Code Online (Sandbox Code Playgroud)
当我在 Google 上搜索消息时,出现的所有内容似乎都与我未使用的 Admob 或其他不适用的特定案例有关,其中大部分来自几年前,但我还没有看到这在今天之前。
这些消息是什么意思?我能摆脱它们吗?请注意,禁用OS_ACTIVITY_MODE不是一种选择,我不想隐藏所有内容。
经过进一步测试,这似乎只发生在 iOS 13.4 或更高版本中,但我找不到任何发行说明或任何有关它的信息,因此我不确定这是错误还是新功能的一部分。尽管如此,我仍然希望能够摆脱它。
我正在尝试将 a 传递ng-template给我的指令,如下所示:
组件.html
<div myDirective [myTemplate]="myTemplate"></div>
<ng-template #myTemplate><p>Lorem ipsum dolor sit amet.</p></ng-template>
Run Code Online (Sandbox Code Playgroud)
指令.ts
import {Directive, Input} from "@angular/core"
@Directive({
selector: "[myDirective]"
})
export class MyDirective {
@Input() myTemplate
ngOnInit () {
console.log(this.myTemplate.elementRef.nativeElement)
}
}
Run Code Online (Sandbox Code Playgroud)
但这只是表明<!-- -->。如何访问模板的内容?其他属性似乎都没有它 - 关于这个问题的评论建议使用templateRef它,但它是未定义的。
澄清一下,该指令的最终目标是有条件地将模板的内容添加到其父元素(以及一些其他更改)。
Swift 4.2 引入了一个新的removeAll {where:} 函数。根据我的阅读,它应该比使用过滤器 {where:} 更有效。我的代码中有几个场景,如下所示:
private func getListOfNullDates(list: [MyObject]) -> [MyObject] {
return list.filter{ $0.date == nil }
.sorted { $0.account?.name < $1.account?.name }
}
Run Code Online (Sandbox Code Playgroud)
但是,我不能将 removeAll{where:} 与参数一起使用,因为它是一个常量。所以我需要像这样重新定义它:
private func getListOfNullDates(list: [MyObject]) -> [MyObject] {
var list = list
list.removeAll { $0.date == nil }
return list.sorted { $0.account?.name < $1.account?.name }
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下使用 removeAll 函数是否仍然更有效?还是坚持使用过滤功能更好?
var myString = "x",
myObject = {
x: 10
},
value = eval("myObject." + myString);
alert(value)
alert(myObject[myString]);
Run Code Online (Sandbox Code Playgroud)
http://jslinterrors.com/eval-is-evil/
我一直在阅读关于互联网上的eval()函数,但除了" 它评估一个表达式 " 之外,它无法真正掌握它的实际功能.
我们应该只为数值使用eval()函数吗?