小编Dar*_*oot的帖子

使用 NWConnection 进行长时间运行的 TCP 套接字的正确方法

我整天都在与 NWConnection 作斗争,以在长时间运行的 TCP 套接字上接收数据。由于缺乏文档,我在给自己造成以下错误后终于让它工作了:

  1. 数据不完整(由于只调用一次receive)
  2. 获取 TCP 数据无序(由于从计时器“轮询”接收......导致多个同时关闭等待获取数据)。
  3. 遭受无限循环(由于在接收后重新启动接收而不检查“isComplete”布尔 - 一旦套接字从另一端终止,这是......糟糕......非常糟糕)。

我所学到的总结:

  1. 一旦您处于 .ready 状态,您就可以调用 receive...一次且仅一次
  2. 一旦收到一些数据,您可以再次调用 receive...但前提是您仍处于 .ready 状态并且 isComplete 为 false。

这是我的代码。我认为这是对的。但如果错了请告诉我:

    queue = DispatchQueue(label: "hostname", attributes: .concurrent)
    let serverEndpoint = NWEndpoint.Host(hostname)
    guard let portEndpoint = NWEndpoint.Port(rawValue: port) else { return nil }
    connection = NWConnection(host: serverEndpoint, port: portEndpoint, using: .tcp)
    connection.stateUpdateHandler = { [weak self] (newState) in
        switch newState {
        case .ready:
            debugPrint("TcpReader.ready to send")
            self?.receive()
        case .failed(let error):
            debugPrint("TcpReader.client failed with error \(error)")
        case .setup: …
Run Code Online (Sandbox Code Playgroud)

networking swift

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

对于没有默认情况的Double类型,swift开关可以是穷举吗?

对于没有默认情况的Double类型,swift开关可以是穷举吗?

此开关(没有默认情况)给出错误:开关必须是详尽的:

    var minY = 1.0

    switch minY {
    case -(Double.infinity)..<0.9:
        yAxisMinimum = 0.0
    case (0.9..<0.99):
        yAxisMinimum = 0.9
    case (0.99..<0.999):
        yAxisMinimum = 0.99
    case (0.999..<0.9999):
        yAxisMinimum = 0.999
    case (0.9999...Double.infinity):
        yAxisMinimum = 0.9999
    }
Run Code Online (Sandbox Code Playgroud)

但是这个带有(无用的)默认情况的开关可以工作:

    var minY = 1.0

    switch minY {
    case -(Double.infinity)..<0.9:
        yAxisMinimum = 0.0
    case (0.9..<0.99):
        yAxisMinimum = 0.9
    case (0.99..<0.999):
        yAxisMinimum = 0.99
    case (0.999..<0.9999):
        yAxisMinimum = 0.999
    case (0.9999...Double.infinity):
        yAxisMinimum = 0.9999
    default:
        yAxisMinimum = 0.0
    }
Run Code Online (Sandbox Code Playgroud)

我尽量避免使用我的开关的默认情况,但不知道是否可以使用Double.

switch-statement swift

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

SwiftUI EnvironmentObject 在视图初始值设定项中不可用?

我成功地将 environmentObject appSettings 传递到我的视图中。我可以用它来修改我的字体和视图中的选择器。但是,如果我尝试在视图 init() 中访问 environmentObject 发布的变量,它会崩溃:

Thread 1: Fatal error: No ObservableObject of type AppSettings found.
A View.environmentObject(_:) for AppSettings may be missing as an ancestor of this view.
Run Code Online (Sandbox Code Playgroud)

在自定义 SwiftUI 视图初始值设定项中使用 environmentObject 是否有特殊规则?

这是我的视图代码的开始。environmentObject 是 appSettings。如果我在初始化程序中注释掉第 2 行并取消注释第 3 行,应用程序就可以运行。请注意,我稍后在我的选择器中成功使用了“appSettings.interfaces”。

struct CaptureFilterView: View {

@State var etherCapture: EtherCapture? = nil
@EnvironmentObject var appSettings: AppSettings
@Binding var frames: [Frame]
@State var captureFilter: String = ""
@State var error: String = ""
@State var numberPackets = 10

@State var …
Run Code Online (Sandbox Code Playgroud)

swiftui

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

如何在 Swift 中验证 IPv4 和 IPv6 地址?

IPv4 地址相对容易验证:它们有 4 个八位字节,由数字分隔。每个八位位组都是 0-255 范围内的整数。

IPv6 地址很难验证。它们有 8 个十六进制数,每个十六进制数有 4 个十六进制数字,用冒号分隔。IPv6 地址还具有缩短规则,可以删除每个十六进制数中的前导零(在每个十六进制数中至少留下一个零)。此外,一个或多个连续的 :0: 十六进制可以缩短为 ::,但每个 IPv6 地址中只能缩短一次。

如何在 Swift 中验证 IPv4 和 IPv6 地址?

network-programming swift

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