标签: swift5

有时不使用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
查看次数

在子视图中更新 ObservableObject 的 @Published 变量

isLoggedIn在 ObservableObject 类中有一个已发布的变量,如下所示:

import Combine

class UserAuth: ObservableObject{
    @Published var isLoggedIn: Bool = false
}
Run Code Online (Sandbox Code Playgroud)

我想在特定视图 (LoginView) 中将此变量更新为 true。此变量决定了我向用户显示的视图,具体取决于用户是否已登录:

struct ContentView: View {
    @ObservedObject  var userAuth = UserAuth()
    var body: some View {
        Group{
            if(userAuth.isLoggedIn){
                MainView()
            }else{
                AccountView()
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

因为userAuth.isLoggedIn是false(我还没登录)AccountView就显示出来了。

账户视图:

struct AccountView: View {
    @State private var toggleSheet = false
    var body: some View {
        VStack {
            Spacer()
            Button(action: {
                self.toggleSheet.toggle()
            }){
                Text("Toggle Modal")
                    .padding()
                    .foregroundColor(Color.white)
                    .background(Color.blue)
                    .cornerRadius(10)
            }
            .sheet(isPresented: self.$toggleSheet){
                LoginView()
            }
            Spacer() …
Run Code Online (Sandbox Code Playgroud)

swift swift5 swiftui

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

如何在保持隔离的同时使 Swift actor 符合协议?

假设我们有以下目标:

\n
    \n
  1. 我们想使用演员。
  2. \n
  3. 我们希望使用依赖注入并通过 DI 解析 actor。
  4. \n
  5. 我们希望将我们的参与者隐藏在协议后面,以便我们可以改变实现。
  6. \n
  7. 我们希望保持 Actor 的隔离,否则使用 Actor 就没有意义。
  8. \n
\n

所以具体的问题是:我们如何才能使 Swift actor 遵守协议,同时保持隔离?

\n
protocol Zippity {\n  func foo()\n}\n\nactor Zappity: Zippity {\n  func foo() {} // Doesn\'t compile\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我可以用 \xe2\x80\xa6 编译它

\n
actor Zappity: Zippity {\n  nonisolated func foo() {}\n}\n
Run Code Online (Sandbox Code Playgroud)\n

\xe2\x80\xa6 但这似乎违背了目的。我还尝试声明接口方法async,但也无法编译。

\n

我可以想到几种合理的解决方法,包括组合、nonisolated async调用独立方法的方法等,但想看看是否有我遗漏的东西。

\n

concurrency actor swift swift5

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

如何在 Alamofire 中使用“responseDecodable”方法?

我一直在尝试使用 Alamofire 的“responseDecodable”方法,但在使用它时出现“无法推断通用参数‘T’”错误。 阿拉莫菲尔

有人可以指导我如何解决这个问题吗?

ios swift alamofire swift5

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

Swift 5中切换案例“ @unknown default”和“ default”之间的区别

从Swift 5开始,@unknown引入了新的case属性。

@unknown使用和不使用时的确切区别是什么?在这种情况下,我们必须使用@unknown关键字?

swift swift5

13
推荐指数
4
解决办法
2751
查看次数

如何在 SwiftUI 中的形状中有文字?

我想在 SwiftUI 中的形状(例如方形)中添加文本(例如 Hi)并使它们充当单个对象。

看起来没有直接的方法可以在 SwiftUI 中添加形状中的文本。

swift5 swiftui

13
推荐指数
4
解决办法
9059
查看次数

在 Swift 中调用实例方法错误消息没有完全匹配

我以前从未得到过这个,Swift 中此错误消息的含义是什么:

No exact matches in call to instance method 'dataTask(with:completionHandler:)'
Run Code Online (Sandbox Code Playgroud)

这是我的代码块:

var request: NSMutableURLRequest? = nil
let task = URLSession.shared.dataTask(
            with: request,
            completionHandler: { data, response, error in
                DispatchQueue.main.async(execute: {
                  /// ...
                })
            })
        task.resume()
Run Code Online (Sandbox Code Playgroud)

错误报告

通过feedbackassistant.apple.com 报告:

FB7717686

xcode swift swift5

13
推荐指数
3
解决办法
2万
查看次数

通过应用过滤器去除 nils 后,将类型更改为非可选

let elements: [(Int?, Int?)] = [(1, 2), (2, 1), (3, nil), (nil, 3), (5, 6), (6, 5)]
let result = elements.filter { $0.0 != nil } as! [(Int, Int?)]
Run Code Online (Sandbox Code Playgroud)

有没有更干净的方法来获得部分非可选类型?没有强制解包......
当我们过滤掉 nils 时,编译器应该很明显我们会得到一些非可选的东西。就像我们应用 compactMap 的情况一样。

optional swift swift5

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

在Swift 3.0中生成随机字节

我想SecRandomCopyBytes在Swift 3.0中使用生成随机字节.这是我在Swift 2.2中的表现

private static func generateRandomBytes() -> String? {
    let data = NSMutableData(length: Int(32))

    let result = SecRandomCopyBytes(kSecRandomDefault, 32, UnsafeMutablePointer<UInt8>(data!.mutableBytes))
    if result == errSecSuccess {
        return data!.base64EncodedString(options: NSData.Base64EncodingOptions(rawValue: 0))
    } else {
        print("Problem generating random bytes")
        return nil
    }
}
Run Code Online (Sandbox Code Playgroud)

在Swift 3中,我尝试这样做,因为我知道unsafemutablebytes的概念现在不同了,但它不允许我返回.如果我评论退货部分,它仍然说Generic Parameter ResultType could not be inferred

fileprivate static func generateRandomBytes() -> String? {
    var keyData = Data(count: 32)
    _ = keyData.withUnsafeMutableBytes {mutableBytes in
        let result = SecRandomCopyBytes(kSecRandomDefault, keyData.count, mutableBytes)
        if result == errSecSuccess { …
Run Code Online (Sandbox Code Playgroud)

ios swift swift3 swift5

12
推荐指数
3
解决办法
6768
查看次数

UIAlertController和UIViewAlertForUnsatisfiableConstraints错误

我昨天升级到Xcode 10.2,并开始使用Swift 5,当出现UIAlertController照片提示时会注意到此错误。我不记得在Xcode 10.1中看到过

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x600001321e00 UIView:0x7fe1246070a0.width == - 16   (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
Run Code Online (Sandbox Code Playgroud)

我读过此问题如何捕获UIViewAlertForUnsatisfiableConstraints? 并能够将错误定位到我的位置UIAlertController(以红色突出显示)

在此处输入图片说明

这是我的代码:

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x600001321e00 UIView:0x7fe1246070a0.width == - 16   (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
Run Code Online (Sandbox Code Playgroud)

我试图UIAlertController通过在我的promptPhoto()方法内部使用此代码来设置宽度,但无济于事。


 @objc private func promptPhoto() {

    let prompt = UIAlertController(title: "Choose a Photo",
                                   message: …
Run Code Online (Sandbox Code Playgroud)

ios swift swift5 xcode10.2

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

标签 统计

swift5 ×10

swift ×9

ios ×3

swiftui ×2

xcode ×2

actor ×1

alamofire ×1

concurrency ×1

optional ×1

swift3 ×1

xcode10.2 ×1