我试图想出一种使用属性访问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) 看来,使用惰性变量实现协议所需的变量是不可能的.例如:
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出现错误.
这根本不可能吗?
今天我为我的AngularJS项目采用了Browserify,但有些东西对我来说非常不清楚.在所有示例和博客文章中我都看到过这样的内容:
require('./messages');
angular.module('sling', ['sling.messages']);
Run Code Online (Sandbox Code Playgroud)
exports = angular.module('sling.messages', [])
.controller('MessagesListCtrl', require('./MessagesListCtrl'));
Run Code Online (Sandbox Code Playgroud)
module.exports = function() {
// ...
});
Run Code Online (Sandbox Code Playgroud)
当然,这有效,但为什么这样呢?我已经像这样实现了它并且工作得非常好,并且对于AngularJS项目感觉更正常:
require('./messages');
angular.module('sling', ['sling.messages']);
Run Code Online (Sandbox Code Playgroud)
angular.module('sling.messages', []);
require('./MessagesListCtrl');
Run Code Online (Sandbox Code Playgroud)
angular.module('sling.messages').controller('MessagesListCtrl', function() {
// ...
});
Run Code Online (Sandbox Code Playgroud)
换句话说,我完全跳过exports/module.exports,只使用require基本上包含控制器,服务,过滤器等的文件.
我这样做了吗?我的意思是一切正常,但我以后会遇到麻烦吗?
我是 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) 我的布局代码非常简单,您将在有关新组合布局的每个教程或文章中看到这一点。
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 或博客上没有人谈论它。不确定我在这里做错了什么?
我正在使用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) 我正在尝试在使用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.
这是方法调用的正常顺序:
使用状态恢复时,这称为:
我无法将调用setupUI放入,viewWillAppear因为每次本机返回视图时它也会被执行.
如果decodeRestorableStateWithCoder被称为BEFORE 会更加方便,viewDidLoad因为那时你可以使用恢复的属性.可悲的是,不是这样,所以...... viewDidLoad当我知道我需要在decodeRestorableStateWithCoder之后重新做一遍时,我怎么能阻止这项工作呢?
我已经制定了一个特殊类型的提交按钮的指令,该按钮可以在提交表单时进行监视,然后禁用该按钮并获得一个很好的动画进度条.
当通过按下提交按钮或在其中一个字段中按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和表单使用范围变量?
我想在 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 组件道具做类似的事情?
因此自动合成属性非常棒.但是,当您同时提供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;解决了问题.我只是想知道为什么会这样?
swift ×4
angularjs ×2
ios ×2
browserify ×1
core-data ×1
forms ×1
javascript ×1
objective-c ×1
properties ×1
state ×1
svelte ×1
svelte-3 ×1
sveltekit ×1
synthesize ×1
typescript ×1
uikit ×1