小编Kev*_*ers的帖子

Swift 4:getter和setter直接在struct或class中

我试图想出一种使用属性访问UserDefaults的方法.但是,我陷入困境,因为我无法弄清楚如何使属性动态,可以这么说.

这是通用的想法,我想要的 API :

class AppUserDefaults {
  var username = DefaultsKey<String>("username", defaultValue: "Unknown")
  var age = DefaultsKey<Int?>("age", defaultValue: nil)
}

let props = AppUserDefaults()
props.username = "bla"
print("username: \(props.username)")
Run Code Online (Sandbox Code Playgroud)

但是(当然)不起作用,因为类型DefaultsKey<String>不是String.所以我必须在实现中添加一个value属性DefaultsKey来添加getter和setter,如下所示:

struct DefaultsKey<ValueType> {
  private let key: String
  private let defaultValue: ValueType

  public init(_ key: String, defaultValue: ValueType) {
    self.key = key
    self.defaultValue = defaultValue
  }

  var value: ValueType {
    get {
      let value = UserDefaults.standard.object(forKey: key)
      return value as? ValueType ?? defaultValue
    } …
Run Code Online (Sandbox Code Playgroud)

swift

17
推荐指数
1
解决办法
3492
查看次数

Swift:将协议变量实现为惰性变量?

看来,使用惰性变量实现协议所需的变量是不可能的.例如:

protocol Foo {
  var foo: String { get }
}

struct Bar: Foo {
  lazy var foo: String = "Hello World"
}
Run Code Online (Sandbox Code Playgroud)

编译器抱怨说Type 'Bar' does not conform to protocol 'Foo'.

也无法lazy在协议声明中添加关键字,因为这样会'lazy' isn't allowed on a protocol requirement出现错误.

这根本不可能吗?

lazy-evaluation swift

16
推荐指数
1
解决办法
3096
查看次数

export/module.exports的用途是什么?

今天我为我的AngularJS项目采用了Browserify,但有些东西对我来说非常不清楚.在所有示例和博客文章中我都看到过这样的内容:

/app.js:

require('./messages');
angular.module('sling', ['sling.messages']);
Run Code Online (Sandbox Code Playgroud)

/messages/index.js:

exports = angular.module('sling.messages', [])
    .controller('MessagesListCtrl', require('./MessagesListCtrl'));
Run Code Online (Sandbox Code Playgroud)

/messages/MessagesListCtrl.js:

module.exports = function() {
    // ...
});
Run Code Online (Sandbox Code Playgroud)

当然,这有效,但为什么这样呢?我已经像这样实现了它并且工作得非常好,并且对于AngularJS项目感觉更正常:

/app.js:

require('./messages');
angular.module('sling', ['sling.messages']);
Run Code Online (Sandbox Code Playgroud)

/messages/index.js:

angular.module('sling.messages', []);
require('./MessagesListCtrl');
Run Code Online (Sandbox Code Playgroud)

/messages/MessagesListCtrl.js:

angular.module('sling.messages').controller('MessagesListCtrl', function() {
    // ...
});
Run Code Online (Sandbox Code Playgroud)

换句话说,我完全跳过exports/module.exports,只使用require基本上包含控制器,服务,过滤器等的文件.

我这样做了吗?我的意思是一切正常,但我以后会遇到麻烦吗?

angularjs browserify

15
推荐指数
1
解决办法
4万
查看次数

SwiftPM 在处理本地包时发出有关依赖冲突的警告

我是 Swift 包Saga的作者和维护者,它附带了一个示例应用程序。最近,我在 Xcode 中收到两个关于依赖项设置方式的警告,我不知道如何解决这个问题。警告:

'sagaswimrenderer' dependency on 'https://github.com/loopwerk/Saga.git' conflicts with dependency on '/Users/kevin/Workspace/Saga/Saga' which has the same identity 'saga'. this will be escalated to an error in future versions of SwiftPM.

'sagaparsleymarkdownreader' dependency on 'https://github.com/loopwerk/Saga.git' conflicts with dependency on '/Users/kevin/Workspace/Saga/Saga' which has the same identity 'saga'. this will be escalated to an error in future versions of SwiftPM.

这是Package.swift示例应用程序的文件:

// swift-tools-version:5.5

import PackageDescription

let package = Package(
  name: "Example",
  platforms: [
    .macOS(.v12)
  ],
  dependencies: [
    .package(path: …
Run Code Online (Sandbox Code Playgroud)

swift swift-package-manager

14
推荐指数
0
解决办法
1234
查看次数

带有 groupPagingCentered 的 UICollectionViewCompositionalLayout 未开始居中

我的布局代码非常简单,您将在有关新组合布局的每个教程或文章中看到这一点。

  func createLayout() -> UICollectionViewLayout {
    let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0), heightDimension: .fractionalHeight(1.0))
    let item = NSCollectionLayoutItem(layoutSize: itemSize)
    item.contentInsets = .init(top: 0, leading: 5, bottom: 0, trailing: 5)

    let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(0.93), heightDimension: .fractionalHeight(1.0))
    let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: [item])

    let section = NSCollectionLayoutSection(group: group)
    section.orthogonalScrollingBehavior = .groupPagingCentered

    let layout = UICollectionViewCompositionalLayout(section: section)
    return layout
  }
Run Code Online (Sandbox Code Playgroud)

当我启动应用程序时,单元格未正确居中。只有当我将单元格拖动最微小的量时,它才会弹到正确的位置。

前:

在此输入图像描述

当我拖动它一点点后:

在此输入图像描述

我还没有看到任何关于同样问题的问题。Twitter 或博客上没有人谈论它。不确定我在这里做错了什么?

uikit uicollectionview uicollectionviewlayout swift

13
推荐指数
2
解决办法
2904
查看次数

如何在后台创建多个对象?

我正在使用MagicalRecord 2.0.3,我无法弄清楚如何在后台保存数据.

根据文档,这样的东西应该工作:

[MagicalRecord saveInBackgroundWithBlock:^(NSManagedObjectContext *localContext) {
    // Do this hundreds of times
    [MyObject createInContext:localContext];
}];
Run Code Online (Sandbox Code Playgroud)

但是,没有任何内容保存到数据库中.我见过多个人发布类似这样的解决方案:

[MagicalRecord saveInBackgroundWithBlock:^(NSManagedObjectContext *localContext) {
    // Do this hundreds of times
    [MyObject createInContext:localContext];
} completion:^{
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
        [[NSManagedObjectContext defaultContext] saveNestedContexts];
    }];
}];
Run Code Online (Sandbox Code Playgroud)

这确实将我的数据保存在数据库中,但是由于保存发生在主线程上,我的应用程序暂时没有响应(使用我的数据集,大约3秒,这太长了).

我也尝试过这个,但它在保存时也会阻塞:

self.queue = [[NSOperationQueue alloc] init];

[self.queue addOperationWithBlock:^{
    NSManagedObjectContext *localContext = [NSManagedObjectContext contextForCurrentThread];

    // Do this hundreds of times
    [MyObject createInContext:localContext];

    [localContext saveNestedContexts];
}];
Run Code Online (Sandbox Code Playgroud)

最后,与此代码相同的阻止效果:

dispatch_queue_t syncQueue = dispatch_queue_create("Sync queue", NULL);
dispatch_async(syncQueue, ^{
    NSManagedObjectContext *localContext = [NSManagedObjectContext contextForCurrentThread];

    // Do …
Run Code Online (Sandbox Code Playgroud)

multithreading core-data ios magicalrecord

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

UIViewController生命周期调用与状态恢复相结合

我正在尝试在使用iOS 6+和故事板的应用程序中实现状态恢复,但是我在找到防止重量级方法重复调用的方法时遇到了问题.

如果我只是启动应用程序,那么我需要在以下位置设置用户界面viewDidLoad:

- (void)viewDidLoad {
    [super viewDidLoad];
    [self setupUI];
}
Run Code Online (Sandbox Code Playgroud)

这在正常的非状态恢复世界中工作正常.现在我添加了状态恢复,在恢复了一些属性后,我需要用这些属性更新UI:

- (void)decodeRestorableStateWithCoder:(NSCoder *)coder {
    [super decodeRestorableStateWithCoder:coder];
    // restore properties and stuff
    // [...]
    [self setupUI];
}
Run Code Online (Sandbox Code Playgroud)

那么现在发生的事情是首先setupUI调用方法viewDidLoad,然后再调用方法decodeRestorableStateWithCoder:.我没有看到一个我可以覆盖的方法,它始终被称为last.

这是方法调用的正常顺序:

  • awakeFromNib
  • viewDidLoad中
  • viewWillAppear中
  • viewDidAppear

使用状态恢复时,这称为:

  • awakeFromNib
  • viewDidLoad中
  • decodeRestorableStateWithCoder
  • viewWillAppear中
  • viewDidAppear

我无法将调用setupUI放入,viewWillAppear因为每次本机返回视图时它也会被执行.

如果decodeRestorableStateWithCoder被称为BEFORE 会更加方便,viewDidLoad因为那时你可以使用恢复的属性.可悲的是,不是这样,所以...... viewDidLoad当我知道我需要在decodeRestorableStateWithCoder之后重新做一遍时,我怎么能阻止这项工作呢?

state uiviewcontroller ios

10
推荐指数
3
解决办法
3797
查看次数

如何以编程方式使用AngularJS提交表单

我已经制定了一个特殊类型的提交按钮的指令,该按钮可以在提交表单时进行监视,然后禁用该按钮并获得一个很好的动画进度条.

当通过按下提交按钮或在其中一个字段中按Enter键提交表单时,这一切都正常工作,onsubmit处理程序被调用就好了.

问题:在我的一个表单中,我有一个textarea,我想在用户按下回车键时提交.所以我做了一个onEnter指令,只是寻找正确的按键然后执行一个函数.

<form name="form" ng-submit="controller.submit()">
    <textarea ng-model="controller.newMessage.content" 
      autofocus on-enter="controller.submit()"></textarea>
    <progress-button type="submit">Post</progress-button>
</form>
Run Code Online (Sandbox Code Playgroud)

问题当然是这不会触发onsubmit处理程序,因此按钮不会被禁用或任何东西.我该怎么解决这个问题?我尝试了类似的东西document.form.submit(),但是以旧式HTML方式提交表单,当然绕过所有Angular/JS代码和处理程序.我应该找到提交按钮并模拟点击吗?这也感觉非常hackish.

可悲的$scope.form是非常无用,没有提交它.

编辑1:问题很明显:是的,通过on-enter指令调用controller.submit()函数.但是,表单没有得到我的按钮正在侦听的提交事件.

编辑2:这是我的按钮指令的要点.按钮当前需要一个"pb-click"属性,或者它的表单需要一个"pb-submit"属性.这些功能需要返回一个承诺.

将此逻辑移动到从这些函数设置的范围变量可能不是什么大问题,因为这意味着我们可以使用标准,ng-click并且ng-submit不需要返回承诺等.另一方面,如果您在一个页面上有5个按钮然后,您需要创建5个范围变量.也不是最好的主意.或继续使用pb-click和表单使用范围变量?

javascript forms angularjs

9
推荐指数
2
解决办法
1万
查看次数

具有泛型的 Svelte 组件

我想在 Svelte(Kit) 组件的 props 中使用泛型类型,我发现有这样的type T = $$Generic东西:

<script lang="ts">
  import type { Writable } from "svelte/store";
  type T = $$Generic;
  export let store: Writable<T[]>;
</script>
Run Code Online (Sandbox Code Playgroud)

虽然这很棒,但我确实需要比这更多的信息:我要求 具有T属性id。通常我会做这样的事情:

export type WithId = { id: number };
function foo<T extends WithId>(property: T) { ... }
Run Code Online (Sandbox Code Playgroud)

我怎样才能对 Svelte 组件道具做类似的事情?

typescript typescript-generics svelte svelte-3 sveltekit

9
推荐指数
1
解决办法
9168
查看次数

当我提供getter和setter时,为什么需要编写@synthesize?

因此自动合成属性非常棒.但是,当您同时提供getter和setter时,会出现错误.

@property (strong, nonatomic) NSArray *testArray;

- (NSArray *)testArray {
    return _testArray;
}

- (void)setTestArray:(NSArray *)testArray {
    _testArray = testArray;
}
Run Code Online (Sandbox Code Playgroud)

错误:Use of undeclared identifier '_testArray'.

添加@synthesize testArray = _testArray;解决了问题.我只是想知道为什么会这样?

properties objective-c synthesize

8
推荐指数
2
解决办法
4277
查看次数