我正在创建一个 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) 我正在使用 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) 我需要在 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 代码中所做的那样,使这个工作表模式演示全屏显示?
Swift 的 String 类型有一个名为 name 的属性isEmpty,指示字符串是否没有字符。
我想知道使用isEmpty空字符串文字和检查空字符串文字的相等性之间是否有任何区别。换句话说,myString.isEmpty还有比 更好吗myString == ""?
我做了一些研究并提出了以下建议:
\n\nisEmpty而不是检查字符串的长度:\n\n\n要检查字符串是否为空,请使用其
\nisEmpty属性,而不是将其中一个视图的长度与 进行比较0。与 isEmpty 不同,计算 view\xe2\x80\x99s 计数属性需要迭代字符串的元素。
Rob Napier 在 StackOverflow 上对 2015 年略有不同的问题的回答如下:
\n\n\n空字符串是唯一的空字符串,因此不应该存在
\nstring.isEmpty()返回与 不同的值的情况string == ""。当然,他们可能会花费不同的时间和内存来完成此操作。它们是否使用不同的时间和内存量是一个未描述的实现细节,但这isEmpty是检查 Swift 的首选方法(如文档所述)。
一些博客文章还建议使用isEmptyspecial而不是检查字符串的长度是否为0。
然而,这些来源都没有反对与空文字进行比较。
\n\nmyString.count == …
我正在尝试将 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)