小编Joh*_*ery的帖子

Xcode - 更改switch语句的缩进规则

当我写一个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)或者讨论哪种方式是"正确的"而不是提供改变它的方法.

xcode swift

17
推荐指数
3
解决办法
1607
查看次数

取消订阅订阅数组

在一个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选项作为"最佳"解决方案,但我仍然不满意.是否有一种更清洁的方式来做到这一点,我错过了?

rxjs typescript angular

12
推荐指数
1
解决办法
4855
查看次数

通过 ngIf 出现后聚焦元素

我有一个按钮,当点击它时,它会被一个输入字段和一个确认按钮替换,然后当输入完成时,它会再次被原始按钮替换。发生这种情况时,我希望它在原始按钮出现后将其聚焦(一些用户要求更好地支持选项卡导航),但我似乎无法始终如一地做到这一点。我能做的最好的是:

// 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()">&#10003;</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,按钮就会出现,但由于某种原因,在我移动鼠标之前它不会获得焦点. 我如何让它立即对两者都起作用?

focus typescript angular-ng-if angular

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

将"或"逻辑与多个"if case"语句一起使用

假设我有一个带有关联值的枚举案例,以及该枚举类型的两个变量:

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)

但是,这不编译.是否有另一种方法来编写这个以使逻辑工作?

enums boolean-logic swift associated-value

10
推荐指数
4
解决办法
1273
查看次数

警卫不打开可选

我正在尝试处理一个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)

我在这里错过了什么吗?

optional swift

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

重复RxJS导入警告

我刚刚从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搜索仅返回警告消息的单个结果,并且似乎没有解决相同的问题(没有任何文件具有任何已弃用的导入).

这是什么意思,有什么值得担心的吗?

migration rxjs typescript angular

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

初始化 WKWebView 时出现意外的控制台消息

每当我创建一个 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 或更高版本中,但我找不到任何发行说明或任何有关它的信息,因此我不确定这是错误还是新功能的一部分。尽管如此,我仍然希望能够摆脱它。

ios swift wkwebview

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

将 ng-template 元素传递给指令

我正在尝试将 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它,但它是未定义的。

如果需要的话,进行堆栈闪电战

澄清一下,该指令的最终目标是有条件地将模板的内容添加到其父元素(以及一些其他更改)。

typescript angular-directive angular2-template angular

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

修改参数值时使用 filter{where:} 与 removeAll{where:} 的效率

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 函数是否仍然更有效?还是坚持使用过滤功能更好?

swift swift4.2

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

eval做了什么以及为什么它的邪恶?

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()函数吗?

javascript eval

3
推荐指数
2
解决办法
7257
查看次数