小编dr_*_*rto的帖子

使用JSONEncoder将nil值编码为null

我正在使用Swift 4 JSONEncoder.我有一个Codable带有可选属性的结构,我希望这个属性在null值为时在生成的JSON数据中显示为值nil.但是,JSONEncoder丢弃该属性并且不将其添加到JSON输出.有没有办法配置,JSONEncoder以便它保留密钥并null在这种情况下将其设置为?

下面的代码片段会产生{"number":1},但我更愿意给它{"string":null,"number":1}:

struct Foo: Codable {
  var string: String? = nil
  var number: Int = 1
}

let encoder = JSONEncoder()
let data = try! encoder.encode(Foo())
print(String(data: data, encoding: .utf8)!)
Run Code Online (Sandbox Code Playgroud)

json ios swift4 codable

39
推荐指数
2
解决办法
5840
查看次数

具有Void关联类型的Generic Swift 4枚举

TL;博士

是否可以实例化具有相关类型值的通用Swift 4枚举成员Void

背景

我正在使用一个简单的结果枚举(类似于antitypical结果):

enum Result<T> {
  case success(T)
  case error(Error?)
}
Run Code Online (Sandbox Code Playgroud)

现在我想用这个枚举来表示一个不产生实际结果值的操作的结果; 操作成功失败.为此,我将类型定义为Result<Void>,但我正在努力如何创建Result实例,既不起作用let res: Result<Void> = .successlet res: Result<Void> = .success()不起作用.

enums swift swift4

31
推荐指数
3
解决办法
1万
查看次数

更改日期时,SwiftUI DatePicker 在中短日期格式之间跳转

(使用 Xcode 12.3 和 iOS 14.3)

我使用DatePicker具有默认样式 ( DefaultDatePickerStyle)的组件来显示和编辑日期:该组件在标签中显示当前日期值,并在点击该标签时弹出日历。到现在为止还挺好。

当我更改日期时(以编程方式或在 UI 中手动更改),组件会不规律地更改其标签的日期格式。它似乎在 的.short.medium值之间切换DateFormatter.Style。请注意,日期格式不能以编程方式设置,它是DatePicker.

下面是一个例子:

更改日期时日期格式更改

DatePicker显示“2021年2月7日”; 我通过使用按钮减去一天来更改日期,导致组件显示“2/6/21”;再次减去一天,显示会更改为“2021 年 2 月 5 日”等。有时它会为几个日期保持相同的格式,但大多数情况下它会在每次更改时切换。

示例代码:

struct DateView: View {
  @State var date = Date()

  var body: some View {
    VStack(spacing: 20) {
      Button("-1 day") {
        date.addTimeInterval(-24*60*60)
      }
      Button("+1 day") {
        date.addTimeInterval(24*60*60)
      }
      DatePicker(
        "Date",
        selection: $date,
        displayedComponents: .date
      ).labelsHidden()
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

省略displayedComponentslabelsHidden对该问题没有影响。

重复打开日历弹出窗口并选择日期时也会出现同样的问题:关闭弹出窗口后,显示的日期有时是短格式,有时是中等格式。

知道那里发生了什么吗?

ios swiftui

15
推荐指数
2
解决办法
608
查看次数

斯威夫特我如何检查我是否遍历List [String]的最后一项

我需要检查何时遍历最后一个项目。我不能只在for循环后放置该行,因为这样我总是收到一个空列表。我尝试了以下方法,但此方法不起作用:

   .observeSingleEvent(of: .value, with: { (snapshot) in
            if snapshot.exists(){

                for rest in snapshot.children.allObjects.count as! [DataSnapshot] {
                    let refi = Database.database().reference().child("Users")
                    refi.observeSingleEvent(of: .value, with: { (snapshoti) in
                        if snapshoti.value as! String == "active"{

                            let userid = rest.key
                            self.someProtocol[rest.key] = self.checksum

                            if self.checksum == self.someProtocol.count-1 {
                                self.sortUsers()
                            }else{

                            }
                            self.checksum = self.checksum+1


                        }

                    })

                }
Run Code Online (Sandbox Code Playgroud)

ios swift

7
推荐指数
2
解决办法
4904
查看次数

从参数化 getter 访问 getter

太长了;博士

如何从参数化 getter 访问其他 getter?通常,您可以使用this.myGetter; 但是参数化的 getter 是作为箭头函数实现的,其中this是未定义的。在 Pinia 处理此案的首选方式是什么?


我想multiSum在我的 Pinia 商店中创建一个参数化 getter ( ),它访问另一个 getter ( sum)。

getter 可以通过 访问this,但是在用于实现参数化 getter 的箭头函数中不起作用:multiSum崩溃,因为this位于undefined嵌套箭头函数的上下文中。

getters: {
  sum: (state) => state.a + state.b,
  multiSum: (state) => (count) => this.sum * count // crash: this is undefined
}
Run Code Online (Sandbox Code Playgroud)

在 Vuex 中,参数化 getter 可以通过参数而不是 来访问其他 getter this,这也适用于箭头函数。但据我所知,Pinia 中不存在此 API。

我可以通过捕获商店实例来解决这个问题:

multiSum(state) {
  const store = this
  return …
Run Code Online (Sandbox Code Playgroud)

javascript vue.js pinia

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

如何在swift中将回调函数传递给sqlite3_exec?

如何将回调函数传递给sqlite3_execSwift?

sqlite_str = sqlite_str + "\(sqlite_property_str))";

var str:NSString = sqlite_str;

var sqlite:COpaquePointer = share().sqlite3_db;
var errmsg:UnsafePointer<Int8> = nil

let rc = sqlite3_exec(sqlite, str.cStringUsingEncoding(NSUTF8StringEncoding), <#callback: CFunctionPointer<((UnsafePointer<()>, Int32, UnsafePointer<UnsafePointer<Int8>>, UnsafePointer<UnsafePointer<Int8>>) -> Int32)>#>, <#UnsafePointer<()>#>, <#errmsg: UnsafePointer<UnsafePointer<Int8>>#>)
Run Code Online (Sandbox Code Playgroud)

sqlite list swift

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

在 iTunesConnect 中被拒绝后,无法将应用内购买重新添加到应用中

我创建了一个可自动更新的应用内购买 (IAP) 并将其添加到 iTunesConnect (ITC) 中的应用中。该应用程序被拒绝是因为二进制文件和 AppStore 元数据中缺少最终用户的信息(我必须解释它的成本,它是自动更新的等等)。所以我将缺少的信息添加到应用程序和元数据中......

tl;博士

...但现在我无法再将现有的 IAP 添加到 ITC 中的应用程序版本。


详细演练

...(希望)修复了问题,然后我删除了旧版本(清除了应用程序版本的错误状态)并添加了固定版本。“功能”选项卡中的 IAP 上仍然有一个危险信号;我按照这个提示解决了这个问题。再往野兽的肚子里挖,发现IAP组的名字旁边也有一个红色的标记。这次我遵循了这个提示并摆脱了那个错误。

IAP 状态现在是“等待审核”,我不完全理解,因为我无法自行将 IAP 发送到审核中(或者我可以?)。返回应用程序版本页面时,我无法再将 IAP 添加到版本中(如本指南的第一个屏幕截图所示)。

我现在该怎么办?

  • 删除 IAP 并创建一个新的 IAP?
  • 删除整个应用程序并创建一个新应用程序?
  • 只是提交应用程序并希望 IAP 仍然可用,即使它没有显示在应用程序版本的详细信息中?

编辑

正如在评论中已经提到:我的问题是不是重复这一个。在那里,解决方案是将 IAP 添加到“版本详细信息”页面的“应用内购买部分”。

我很清楚这将是解决方案。但是,我的问题的全部意义在于,我无法使用这一部分。我之前已经执行了所有提到的步骤,但是在此部分消失后应用程序被拒绝后,我无法再添加 IAP。

看起来 ITC 认为我的(单个)IAP 无效,因此不允许我选择它……因此对于 ITC,甚至没有理由显示用于添加 IAP 的 UI。

xcode in-app-purchase ios app-store-connect

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

位置:在 iOS Safari 上键盘处于活动状态时固定

我正在尝试使用固定位置在 iOS 设备上正常工作。

这是键盘未打开时的样子:

屏幕截图:键盘未处于活动状态

对于上面的聊天窗口我使用了这段代码:

    position: fixed;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
Run Code Online (Sandbox Code Playgroud)

当我点击输入框(写消息)时,键盘打开,顶部部分随着屏幕放大而隐藏,如下所示:

屏幕截图:当键盘处于活动状态时

我认为 ios 会忽略top: 0键盘何时打开。我可以做什么来避免这种情况?

chrome 上不存在这样的问题。

css iphone safari ios responsive

5
推荐指数
0
解决办法
637
查看次数

iOS应用启动时崩溃

您好,我的应用在启动Apple Review Team时崩溃,并且没有收到崩溃报告 Crashlytics,并且,这就是为什么我仅有的信息是他们的响应和崩溃报告。因此,我与您分享了我的信息,但我没有在其中找到适当的信息,也许有人可以更好地阅读它...

响应:

由于您的应用在启动时崩溃,因此我们无法对其进行审核。我们已附上详细的崩溃日志,以帮助解决此问题。

日志:

log_1log_2

UPD:在这里我发现

终止说明:SPRINGBOARD,场景创建看门狗越界:team.codebusters.1fit耗尽了实际时间(壁钟),为17.74秒| | ProcessVisibility:前景| ProcessState:正在运行| WatchdogEvent:场景创建| 看门狗可见性:前景| WatchdogCPUStatistics :( | |“已耗用的总CPU时间(秒):36.550(用户36.550,系统0.000),CPU为61%”,|“已耗用的应用程序CPU时间(秒):1.321,CPU为2%” |)

crash logging review ios swift

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

如何在Swift 4中保留Realm List属性?

使用Swift 4和Realm 3.0.1,我想将Realm对象列表存储在父Realm对象的属性中.我遇到了以下问题:

在Swift 4中,应该持久保存到Realm中的属性必须是@objc dynamic,例如@objc dynamic var id: String = "".但是,Realm的Array替换类型,List不能以这种方式存储:@objc dynamic var children: List<Child>? = nil导致此编译器错误:

属性不能标记为@objc,因为其类型无法在Objective-C中表示

有关更多上下文,这是一个完整的示例:

final class Child: Object {
  @objc dynamic var name: String = ""
}

final class Parent: Object {
  // this fails to compile
  @objc dynamic var children1: List<Child>?

  // this compiles but the children will not be persisted
  var children2: List<Child>?
}
Run Code Online (Sandbox Code Playgroud)

那么还有另一种在Realm和Swift 4中存储对象列表的方法吗?

realm ios swift4

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

具有类似 scaleAspectFill 行为的 UINavigationBar 背景图像

tl;博士

我正在尝试为UINavigationBar. 有没有办法配置导航栏,使其使用scaleAspectFill类似行为(作为UIImageViewwith contentModeset to scaleAspectFill)?


目标

我有一张图像大致适合横向 iPhone 的导航栏尺寸(64pt 高度,大约 800pt 宽度;不过,确切的尺寸在这里无关紧要),我用navigationBar.setBackgroundImage(img, for: .default). 图像是一张模糊的照片,所以不需要像素完美。顺便说一句 - 我正在使用UINavigationBar.appearance一次为所有导航栏设置背景。

  1. 我想要它做什么:在纵向时显示图像的中心部分,在横向时显示完整图像而不进行裁剪。如果高度不完全匹配(正如在 iPhone X 上预期的那样),它应该放大一点以填充额外的高度。

  2. 作为后备解决方案,如果较小宽度的图像显示居中并通过拉伸第一个和最后一个像素列来填充额外的水平空间,我也会接受。

到目前为止我尝试过的

  • 目标 1:在渲染图像时设置contentModeof UINavigationBar-- 似乎被忽略
  • 目标 2:使用较小的图像并使其可拉伸stretchableImage(withLeftCapWidth:topCapHeight:)- 填充导航栏但图像被推到右下角(显然是因为此方法仅将左侧和顶部视为可拉伸的边距)
  • 目标 2:使用较小的图像并resizableImage(withCapInsets:resizingMode:)使用resizingModeset to使其可调整大小stretch- 在横向中它只是将图像拉伸到全宽,而忽略了大写插图(可能这种方法并没有按照我的想法行事)。

uinavigationbar uiimage ios swift

3
推荐指数
1
解决办法
3048
查看次数

Swift协议实现另一个@objc协议

使用Swift 4,我试图编写一个自定义协议,该协议提供与@objc协议的一致性。

一些代码

更具体地说,我有一个自定义协议Searchable,该协议提供了UIKit协议的简单实现,UISearchBarDelegate只需要实现一个用于处理搜索过滤器更改的回调即可。

@objc protocol Searchable: class, UISearchBarDelegate {
  @objc func searchFilterChanged(_: String?)
}
Run Code Online (Sandbox Code Playgroud)

我在协议扩展中提供了委托实现:

extension Searchable {
  func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    searchFilterChanged(searchText)
  }
  // .. and some other delegate methods
}
Run Code Online (Sandbox Code Playgroud)

最后,在另一个扩展中,我创建并安装搜索栏(installSearchBar必须从viewDidLoad具体视图控制器中调用):

extension Searchable where Self: UITableViewController {
  func installSearchBar() {
    let searchBar = UISearchBar()
    searchBar.delegate = self
    tableView?.tableHeaderView = searchBar
  }
}
Run Code Online (Sandbox Code Playgroud)

问题

不幸的是,UISearchBarDelegate当用户在搜索栏中输入文本时,不会调用的委托方法。编译器通过以下消息警告我:

非'@objc'方法'searchBar(_:textDidChange :)'不满足'@objc'协议'UISearchBarDelegate'的可选要求

但是,我无法添加@objc该方法,因为这会导致以下编译器错误:

@objc只能与类的成员,@ objc协议和类的具体扩展一起使用

问题

所以现在我的问题是:所需的行为是否可以在Swift中实现,还是不能在另一协议中实现对@objc协议的一致性? …

ios swift4

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