小编Vad*_*aev的帖子

Swift Package - 如何从实际的 Swift Package 中排除根 git 目录中的文件?

我正在创建一个 Swift 包,它本质上是从 Objective-C 框架生成的多个 XCFramework 的包装器,以便可以通过 SPM 安装它们。

就创建 SP 以及将其作为依赖项添加到应用程序的能力而言,一切工作正常。但是我在 SP 的存储库中包含了一堆非必要的文件,我不想将它们包含在实际的 SP 中 -即,当 SP 作为依赖项添加时,它们不应该显示在 Xcode 的导航器中。 (这些包括源 Obj-C 框架、自述文件、更改日志、用于演示应用程序的 Xcode 工作区、用于生成 XCFrameworks 的脚本文件等)

这可能吗?或者 SPM 是否会始终检出整个存储库并使所有文件对用户可见?

我尝试过使用Target说明符的各种排列:source, path, exclude但无济于事。

这是我可以通过有效清单获得的最接近的结果,但是当我在虚拟 Xcode 应用程序中查看 SP 时,我仍然可以看到包含的存储库中的所有文件:

// swift-tools-version:5.3
// The swift-tools-version declares the minimum version of Swift required to build this package.

import PackageDescription

let package = Package(
    name: "WrapperSwiftPackage",
    platforms: [.iOS(.v13)],
    products: [
        .library(name: "WrapperSwiftPackage", targets: ["WrapperSwiftPackage"])
    ],
    dependencies: [], …
Run Code Online (Sandbox Code Playgroud)

swift swift-package-manager swift-package

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

WatchConnectivity:WCSession.transferUserInfo 在手表上成功,但数据从未到达 iPhone

语境

我正在使用 Xcode 12.3 为 iOS 应用程序构建 watchOS 应用程序(即它不是独立的 watchOS 应用程序)。

我的 watchOS 应用程序需要根据手表上的用户操作向 iOS 发送小块数据(包含字符串和日期的结构),然后 iOS 应用程序会将收到的数据保留在自己的存储中。手表中的数据不需要立即传输,但也不会丢失,最终必须到达 iOS 应用程序。我认为这种transferUserInfo(_:)方法WCSession最适合我的需要。

问题

当我transferUserInfo_:在 watchOS 模拟器上调用默认 WCSession 时,一切都会成功,但数据永远不会到达对应的 iOS 应用程序。

我使用 Xcode 12.3、iOS 14.3 模拟器和配对的 watchOS 7.2 模拟器。

我确保在应用程序启动时激活 WCSession 并检查它是否已成功激活,并在尝试传输用户信息之前检查会话是否处于活动状态。

奇怪的是,我可以使用updateApplicationContext(_:)WCSession 的方法将数据从 iOS 传输到 watchOS,但无法将数据从手表传输回 iOS 应用程序。

代码

我构建了一个最小的示例来说明该问题。watchOS 应用程序显示一个按钮,当用户点击它时,它应该向 iOS 发送一个随机数。iOS 应用程序应该在屏幕上的文本标签中显示收到的号码。

这是示例 iOS 应用程序的完整代码,它只是一个文件:

import os
import SwiftUI
import WatchConnectivity

class WatchConnectivityService: NSObject, ObservableObject {
    @Published private(set) var receivedNumber: Int
    private …
Run Code Online (Sandbox Code Playgroud)

ios ios-simulator watchos watchconnectivity

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

在 SwiftUI 中以全屏模式呈现视图

我需要在 SwiftUI 中以全屏模式呈现一个视图。

在 UIKit 中,以下代码足以呈现UIViewController全屏模态:

let modalViewController = ModalViewController()
modalViewController.modalPresentationStyle = .fullScreen
present(modalViewController, animated: true, completion: nil)
Run Code Online (Sandbox Code Playgroud)

在 SwiftUI 中,我们使用sheet来进行模态视图呈现:

struct ContentView: View {
    @State private var showingSheet = false
    
    var body: some View {
        Button("Show Sheet") {
            showingSheet.toggle()
        }
        .sheet(isPresented: $showingSheet) {
            SecondView(name: "Imran")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在没有全屏呈现的情况下,工作表像卡片一样呈现视图,可以通过下拉视图来将其关闭。

我需要以全屏方式呈现模式视图,以便不能通过下拉将其关闭。

我怎样才能像我在之前的 UIKit 代码中所做的那样,使这个工作表模式演示全屏显示?

ios swift swiftui

6
推荐指数
2
解决办法
4738
查看次数

为什么使用 isEmpty 比 Swift 与空字符串文字的比较更好?

Swift 的 String 类型有一个名为 name 的属性isEmpty,指示字符串是否没有字符。

\n\n

我想知道使用isEmpty空字符串文字和检查空字符串文字的相等性之间是否有任何区别。换句话说,myString.isEmpty还有比 更好吗myString == ""

\n\n

我做了一些研究并提出了以下建议:

\n\n
    \n
  1. Apple 开发人员文档(以及Swift 语言指南)中的字符串结构参考建议使用isEmpty而不是检查字符串的长度:
  2. \n
\n\n
\n

要检查字符串是否为空,请使用其isEmpty属性,而不是将其中一个视图的长度与 进行比较0。与 isEmpty 不同,计算 view\xe2\x80\x99s 计数属性需要迭代字符串的元素。

\n
\n\n
    \n
  1. Rob Napier 在 StackOverflow 上对 2015 年略有不同的问题的回答如下:

    \n\n
    \n

    空字符串是唯一的空字符串,因此不应该存在string.isEmpty()返回与 不同的值的情况string == ""。当然,他们可能会花费不同的时间和内存来完成此操作。它们是否使用不同的时间和内存量是一个未描述的实现细节,但这isEmpty是检查 Swift 的首选方法(如文档所述)。

    \n
  2. \n
  3. 一些博客文章还建议使用isEmptyspecial而不是检查字符串的长度是否为0。

  4. \n
\n\n

然而,这些来源都没有反对与空文字进行比较。

\n\n

myString.count == …

swift swift-string

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

C# SHA1 转换与 Swift SHA1 不匹配

我正在尝试将 c# 代码转换为 swift,其中我尝试将字符串转换为 sha1 哈希值。我正在尝试快速实现类似的结果。但是我得到了不同的结果。如果我遗漏了什么,有人可以指出我正确的方向吗?任何帮助是极大的赞赏。

C# 代码

public static string toSha1Digest(this string str)
{
    using (SHA1 sha1 = new SHA1CryptoServiceProvider())
    {

        var mStr = "test1234";
        
        var uni = new byte[mStr.Length * 2];
        var encoder = Encoding.Unicode.GetEncoder();
        encoder.GetBytes(mStr.ToCharArray(), 0, mStr.Length, uni, 0, true);

        var hByte = sha1.ComputeHash(uni);

        var buildString = new StringBuilder();
        hByte.ToString();
        for (var i = 0; i < hByte.Length; i++)
        {
            buildString.Append(hByte[i].ToString("X2"));
        }
        var convertedString = buildString.ToString();
        buildString = null;
        Array.Resize<byte>(ref uni, 0);
        Console.WriteLine(convertedString);
    }
}
Run Code Online (Sandbox Code Playgroud)

印刷

5387F24564B241075F48BBDFDDDC12640015E92A …
Run Code Online (Sandbox Code Playgroud)

c# sha1 swift

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