标签: swift5

是什么决定了 Swift 5.5 任务初始值设定项是否在主线程上运行?

这是我之前的asyncDetached 在 MainActor call 之后回到主线程的后续。

这是 iOS 视图控制器的完整代码:

import UIKit

func test1() {
    print("test1", Thread.isMainThread) // true
    Task {
        print("test1 task", Thread.isMainThread) // false
    }
}
class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        test1()
        test2()
    }

    func test2() {
        print("test2", Thread.isMainThread) // true
        Task {
            print("test2 task", Thread.isMainThread) // true
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这两个函数test1test2是相同的,并且是从同一位置调用的。然而,其中一个operation:在后台线程上运行其任务初始值设定项函数,另一个在主线程上运行。

是什么决定了这一点?我只能认为这与声明方法的位置有关。但这与声明方法的位置有什么关系呢?

async-await swift swift5

24
推荐指数
2
解决办法
8599
查看次数

23
推荐指数
3
解决办法
6万
查看次数

Swift 包管理器缓存位于哪里(Swift 5.7)?

重新标记 git 提交后,我无法再获取该包,因为 SP 管理器使用了一些我无法找到和清理的缓存。出现错误:

基础 RemoteSourceControl https://github.com/myUser/myRepo版本 1.0.0 的修订版 30c16cab9c718416fee2191ff2ac0b6f91eeb511 与之前记录的值不匹配

我清理了所有我知道的地方:本地 .build 文件夹、Home 和 Library/Caches 文件夹中的 SPM 缓存、DerivedData、删除了 Package.resolved。
使用 Swift 5.7,尝试通过swift package generate-xcodeproj. 有谁知道这个缓存在哪里吗?

macos ios swift swift-package-manager swift5

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

Swift:不建议将Hashable.hashValue作为协议要求;

我的iOS项目一直面临以下问题(这只是警告)。

“ Hashable.hashValue”已作为协议要求弃用;通过实现'hash(into :)'来使类型'ActiveType'与'Hashable'一致

  • Xcode 10.2
  • 迅捷5

源代码:

public enum ActiveType {
    case mention
    case hashtag
    case url
    case custom(pattern: String)

    var pattern: String {
        switch self {
        case .mention: return RegexParser.mentionPattern
        case .hashtag: return RegexParser.hashtagPattern
        case .url: return RegexParser.urlPattern
        case .custom(let regex): return regex
        }
    }
}

extension ActiveType: Hashable, Equatable {
    public var hashValue: Int {
        switch self {
        case .mention: return -1
        case .hashtag: return -2
        case .url: return -3
        case .custom(let regex): return regex.hashValue
        }
    } …
Run Code Online (Sandbox Code Playgroud)

hashable swift swift5

21
推荐指数
2
解决办法
6903
查看次数

方法 'scene(_:openURLContexts:)' 没有被调用

在 info.plist 文件中,我配置URL IdentifierURL Scheme成功。我也可以使用自定义 URL 打开应用程序。问题是当应用程序第一次启动该方法时

func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) 
Run Code Online (Sandbox Code Playgroud)

不叫。

我有一些基于上述方法的依赖功能。所以当应用程序第一次启动时,我在我的应用程序中看不到任何东西。

我还在方法中添加了代码

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        
        guard let _ = (scene as? UIWindowScene) else { return }
        
        let url = connectionOptions.urlContexts.first?.url
        
    }
Run Code Online (Sandbox Code Playgroud)

但我在这里得到的 url 为零。

但是,如果我的应用程序处于后台模式并且我点击了 URL,那么上述方法调用成功并且相关功能正常工作。以下是我scene(_:openURLContexts:)sceneDelegate.

func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>){
        let url = URLContexts.first?.url
        let urlString: String = url!.absoluteString
        
        if let urlComponents = URLComponents(string: urlString),let queryItems …
Run Code Online (Sandbox Code Playgroud)

iphone custom-scheme-url swift5 ios13

19
推荐指数
3
解决办法
4339
查看次数

SwiftUI:在不同 iOS 版本之间使用视图修饰符,无需 #available

我使用以下代码片段(在Xcode 13 Beta 5部署目标设置为 14.0 中)根据 iOS 版本有条件地应用视图修饰符:

struct ContentView: View {
    var body: some View {
        Text("Hello, world!")
            .modifyFor(iOS14: {
                $0.onAppear {
                    //do some stuff
                }
            }, iOS15: {
                $0.task { //<---- Error: 'task(priority:_:)' is only available in iOS 15.0 or newer
                    //do some stuff
                }
            })
    }
}

struct CompatibleView<Input: View,
                      Output14: View,
                      Output15: View>: View {
    var content: Input
    var iOS14modifier: ((Input) -> Output14)?
    var iOS15modifier: ((Input) -> Output15)?
    
   @ViewBuilder var body: some View { …
Run Code Online (Sandbox Code Playgroud)

swift swift5 swiftui xcode13

18
推荐指数
3
解决办法
6389
查看次数

转换不可发送的函数值可能会引入数据竞争

我有一段简单的代码:

struct ContentView: View {
    var body: some View {
        Text("Hello world!")
            .task {
                await myAsyncFunc()
            }
    }

    private func myAsyncFunc() async {}
}
Run Code Online (Sandbox Code Playgroud)

这编译完全没问题。但是,如果我用以下内容替换任务:

.task(myAsyncFunc)
Run Code Online (Sandbox Code Playgroud)

它不起作用,并给我以下错误:

将不可发送的函数值转换为“@Sendable () async -> Void”可能会引入数据争用

这是为什么?我该如何解决它?

swift swift5 swiftui swift-concurrency

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

swiftUI中scrollView的填充高度

我正在使用 swiftUI 进行编码,并且我有一个垂直的scrollView(参见屏幕截图),在其中scrollView我有另一个水平的scrollView,在其下面我有一个VStack我希望高度将屏幕的其余部分填充到垂直的底部scrollView,但我似乎无法让它发挥作用。

在某些情况下,垂直方向的内容scrollView可能大于实际剩余空间,这就是为什么我需要滚动视图,但在其他一些情况下,内容小于剩余空间

这是我的代码:

    VStack {
        HeaderView
        
        ScrollView(.vertical, showsIndicators: false) {
            FriendsHorizontalScrollView()
            
            VStack {
                // I want this view to take all the remaining height left in the scrollView
                FullHeightView()
            }
            .frame(width: UIScreen.main.bounds.width)
        }
    }
Run Code Online (Sandbox Code Playgroud)

我最终得到的是这样的:

在此输入图像描述

我想要拥有什么:

在此输入图像描述

我尝试了几种解决方案,例如使用 GeometryReader 或安装.frame(maxHeight: .infinity)VStack但似乎都无法正常工作。

scrollview ios swift swift5 swiftui

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

有时不使用Swift 5编译器调用子类中的委托方法

编辑:正如sunshinejr这里指出的,此问题已修复,将与下一个Xcode / Swift版本一起发布。


在使用Swift 4和Swift 5代码库将Xcode 10.1更新为Xcode 10.2之后,我已经看到很多奇怪的行为。

问题之一是在一个ViewController上不再调用ScrollView委托方法。简化的视图层次结构如下:

| ScrollView (ParentScrollView)
| -- Stack View
| ---- ScrollView (ChildScrollView)
| ---- ScrollView (ChildScrollView)
| ---- ScrollView (ChildScrollView)
Run Code Online (Sandbox Code Playgroud)

它充当具有多个页面的视图:ParentScrollView可以水平滚动,ChildScrollView垂直滚动。

ViewController是所有Scrollview(在Storyboard中设置)的委托,但是scrollViewDidEndDecelerating在滚动任何视图(ParentScrollView或ChildScrollView)时不会调用委托方法(如)。该基类ViewController符合UIScrollViewDelegate

我试过在代码中设置委托,除了不知道自己可能做错了什么。该转换未更改该类中的任何代码,但是在更新之前一切正常。在Swift 5发行说明中,我也通常找不到手势,委托或ScrollView的任何更改。

Swift 5编译器似乎是一个错误。此外,有时它确实起作用,有时却不起作用-所有这些都无需更改任何代码或项目设置。

为什么这不再起作用?有没有其他人经历过类似的行为?

xcode swift swift5

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

在更新到Xcode 10.2之后,在Swift 4.2中无效的'variable.storage'重新声明

我们有一个iOS项目。Swift语言版本为4.2。我们以前是在Xcode 10.1中构建它的,没有编译错误。

更新到Xcode 10.2(但保留Swift 4.2)之后,该项目现在充满了诸如Invalid redeclaration of 'variable.storage'(其中variable的某些变量的名称)之类的错误。这些错误出现在私有的,用惰性方式初始化的变量旁边,这些变量的名称在整个项目中都是常用的,但不在其范围内重新声明;该错误似乎与storage消息的一部分有关。清理并重建不能解决问题。有什么建议么?

编辑:这些错误只出现在两个类中。由于所有这些重新声明错误,我还错过了另一个合法的编译错误(Xcode 10.2中的新功能,但足够合法)。经过一番混乱**之后,我发现错误消失了。似乎是编译器中的错误。

**我的混乱步骤是(1)取消嵌套我遇到这些错误的第一个类,(2)创建一个与未编译的类具有相同内容的新类,并指向该类,(3)注释掉失败的类,(4)找到并修复了合法的编译错误。在这一点上,我不需要弄乱另一个也给出了重新声明错误的类。现在已编译代码。因此,(5)恢复了第一类。因此,这些重新声明错误可能只是误导了;如果您找到并修复了所有与迁移相关的错误,希望您不会看到其中任何一个。

swift4.2 swift5 xcode10.2

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