小编Boh*_*ych的帖子

协议类型的数组

我已经在stackoverflow上检查了关于这个问题的所有答案,但仍然无法弄清楚如何解决这个问题.我的模型看起来像这样

protocol Commandable: Equatable {
    var condition: Condition? {get set}

    func execute() -> SKAction
}
Run Code Online (Sandbox Code Playgroud)

以及实施该协议的3个结构

struct MoveCommand: Commandable {

    var movingVector: CGVector!

    //MARK: - Commandable

    var condition: Condition?
    func execute() -> SKAction {
       ...
    }
}

extension MoveCommand {
    // MARK:- Equatable

    static func ==(lhs: MoveCommand, rhs: MoveCommand) -> Bool {
        return lhs.movingVector == rhs.movingVector && lhs.condition == rhs.condition
    }
}
Run Code Online (Sandbox Code Playgroud)
struct RotateCommand: Commandable {
    var side: RotationSide!

    // MARK: - Commandable

    var condition: Condition?
    func execute() -> SKAction …
Run Code Online (Sandbox Code Playgroud)

generics swift

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

fileprivate和私有扩展之间的区别?

Swift 3.0

我知道fileprivate访问级别修饰符限制使用函数/属性来声明它所声明的源文件,并且private- 仅限于声明的词法范围.但似乎这条规则不适用于扩展.EG此代码有效:

class Foo {
}

fileprivate extension Foo {
    var aa: Int {
        return aaa + 10
    }
}

private extension Foo {
    var aaa: Int {
        return 20
    }
}
Run Code Online (Sandbox Code Playgroud)

有人可以帮我弄清楚它们之间的区别吗?谢谢.

Swift 4.0

private现在可以在扩展名中访问,但在同一文件中.如果您在其他文件中声明/定义扩展名,则扩展程序将无法访问您的私有变量.

fileprivate 可以在同一个文件中访问.

access-modifiers access-control access-levels swift3 swift4

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

在回调,SwiftUI中以编程方式推送View

在我看来,Apple鼓励我们放弃UIViewController在SwiftUI中使用,但如果不使用视图控件,我会觉得有些无能为力。我想要的是能够实现某种ViewModel将事件发送给的功能View

ViewModel

public protocol LoginViewModel: ViewModel {
  var onError: PassthroughSubject<Error, Never> { get }
  var onSuccessLogin: PassthroughSubject<Void, Never> { get }
}
Run Code Online (Sandbox Code Playgroud)

查看

public struct LoginView: View {
  fileprivate let viewModel: LoginViewModel

  public init(viewModel: LoginViewModel) {
    self.viewModel = viewModel
  }

  public var body: some View {
    NavigationView {
      MasterView()
        .onReceive(self.viewModel.onError, perform: self.handleError(_:))
        .onReceive(self.viewModel.onSuccessLogin, perform: self.handleSuccessfullLogin)
    }
  }

  func handleSuccessfullLogin() {
    //push next screen
  }

  func handleError(_ error: Error) {
    //show alert
  } …
Run Code Online (Sandbox Code Playgroud)

ios swift swiftui

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

拖放 UICollectionView 单元格复用问题

所以我为我的 UICollectionView 实现了拖放,如下所示:

func collectionView(_ collectionView: UICollectionView, itemsForBeginning session: UIDragSession, at indexPath: IndexPath) -> [UIDragItem] {
        guard shouldAllowDragForIndexPath?(indexPath) == true else { return [] }
        guard let cell = collectionView.cellForItem(at: indexPath)?.toImage() else {
            return []
        }
        let provider = NSItemProvider(object: cell)
        let item = UIDragItem(itemProvider: provider)
        item.localObject = data[indexPath.row]

        return [item]
    }

    func collectionView(_ collectionView: UICollectionView, performDropWith coordinator: UICollectionViewDropCoordinator) {
        guard
            let item = coordinator.items.first?.dragItem,
            let sourceIndexPath = coordinator.items.first?.sourceIndexPath,
            let destinationIndexPath = coordinator.destinationIndexPath,
            let entity = item.localObject as? T
            else …
Run Code Online (Sandbox Code Playgroud)

drag-and-drop ios uicollectionview swift

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

为什么NSImage.Name存在?

我不明白为什么创建UIImage我只是传递String构造函数但是为了创建NSImage我必须传递NSImage.Name构造函数.这个解决方案背后有什么想法?

码:

iOS版

let image = UIImage(named: "name")
Run Code Online (Sandbox Code Playgroud)

苹果系统

let image = NSImage(named: NSImage.Name("name"))
Run Code Online (Sandbox Code Playgroud)

谢谢.

macos cocoa swift

4
推荐指数
2
解决办法
1244
查看次数

Swift中的Multi-Optional类型

我很好奇为什么Swift不会自动将Multi-Optional类型转换为Optional?我们假设我们有这样的代码:

var a: Int?? = 2
var b: Int? = a //error
Run Code Online (Sandbox Code Playgroud)

所有案例:

       Optional<Optional<2>>
                 /\
        .none       .some(Optional(Int))
                            /\
                       .none  .some(2)
Run Code Online (Sandbox Code Playgroud)

因此,所有的案例有:.none,.some(.none),.some(2).目前雨燕自动转换TypeOptional<Type>那么为什么不能做同样的.some(.none).none?我用扩展方法部分地解决了这个问题,但是例如4-Optional,方法应该被调用2次,这是不好的:

extension Optional {
    public func flatten<Result>() -> Result?
        where Wrapped == Result?
    {
        return self.flatMap { $0 }
    }
}
Run Code Online (Sandbox Code Playgroud)

optional swift

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

如何在SwiftUI中隐藏NavigationView Bar

我无法隐藏NavigationView酒吧。我尝试了两种变体:

代码1:

  public var body: some View {
    NavigationView {
      MasterView()
        .navigationBarHidden(true)
    }
  }
Run Code Online (Sandbox Code Playgroud)

代码2:

  public var body: some View {
    NavigationView {
      MasterView()
    }
      .navigationBarHidden(true)
  }
Run Code Online (Sandbox Code Playgroud)

有谁知道如何解决它?

ios swift swift5 swiftui

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

避免 Equatable 和 Hashable 样板,Swift 4.2

在项目中,我们将类用于模型层,因此我必须编写如下代码:

// MARK: - Hashable
extension Player: Hashable {
    static func == (lhs: Player, rhs: Player) -> Bool {
        return lhs.hashValue == rhs.hashValue
    }

    func hash(into hasher: inout Hasher) {
        hasher.combine(self.name)
    }
}
Run Code Online (Sandbox Code Playgroud)

可以以某种方式避免这种样板吗?默认情况下是否可以实现该Equatable比较.hashValue?谢谢。

swift equatable swift4.2

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