我已经在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) 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 可以在同一个文件中访问.
在我看来,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) 所以我为我的 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) 我不明白为什么创建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)
谢谢.
我很好奇为什么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).目前雨燕自动转换Type到Optional<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) 我无法隐藏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)
有谁知道如何解决它?
在项目中,我们将类用于模型层,因此我必须编写如下代码:
// 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?谢谢。