小编Ada*_*hus的帖子

MacOS 上 SwiftUI 中的按钮问题

我在 MACOS 上使用 SwiftUI

如果我这样做:

      Button(action: { } ) {
        Text("Press")
        .padding()
        .background(Color.blue)
      }
Run Code Online (Sandbox Code Playgroud)

我明白了:

在此处输入图片说明

两个灰色区域是可点击按钮的末端。但我希望按钮是蓝色区域的形状。任何想法如何让整个蓝色区域都可以点击。

(我确实考虑过使用 .onTapGesture 但这不会使按钮动画化,因此您知道您已经点击了它。)

macos button swiftui

17
推荐指数
4
解决办法
5320
查看次数

在 swift 中,为什么我不能实例化具有初始化程序的协议?

我知道通常我无法实例化协议。但是如果我在协议中包含一个初始化程序,那么编译器肯定知道当协议稍后被结构或类使用时,它会有一个可以使用的 init 吗?我的代码如下所示:

protocol Solution {
  var answer: String { get }
}

protocol Problem {
  var pose: String { get }
}

protocol SolvableProblem: Problem {
  func solve() -> Solution?
}

protocol ProblemGenerator {
  func next() -> SolvableProblem
}

protocol Puzzle {
  var problem: Problem { get }
  var solution: Solution { get }

  init(problem: Problem, solution: Solution)
}

protocol PuzzleGenerator {
  func next() -> Puzzle
}

protocol FindBySolvePuzzleGenerator: PuzzleGenerator {
  var problemGenerator: ProblemGenerator { get }
}

extension …
Run Code Online (Sandbox Code Playgroud)

protocols instantiation swift

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

Swift:Lazily封装了map,filter,flatMap的链

我有一份动物名单:

let animals = ["bear", "dog", "cat"]
Run Code Online (Sandbox Code Playgroud)

以及一些转换该列表的方法:

typealias Transform = (String) -> [String]

let containsA: Transform = { $0.contains("a") ? [$0] : [] }
let plural:    Transform = { [$0 + "s"] }
let double:    Transform = { [$0, $0] }
Run Code Online (Sandbox Code Playgroud)

稍微说一下,它们分别类似于过滤器(输出0或1个元素),映射(正好是1个元素)和平面图(多于1个元素),但是以统一的方式定义,以便可以一致地处理它们.

我想创建一个惰性迭代器,它将这些变换的数组应用于动物列表:

extension Array where Element == String {
  func transform(_ transforms: [Transform]) -> AnySequence<String> {

    return AnySequence<String> { () -> AnyIterator<String> in
      var iterator = self
        .lazy
        .flatMap(transforms[0])
        .flatMap(transforms[1])
        .flatMap(transforms[2])
        .makeIterator()

      return AnyIterator {
        return iterator.next()
      } …
Run Code Online (Sandbox Code Playgroud)

functional-programming flatmap swift

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

我如何在 Swift 中投射 @Binding

很快我就可以用 Int(doubleVariable) 将 Int 转换为 Double 。

但是如何将 Binding <Double> 转换为 Binding<Int> 呢?

然后我可以将 @Binding var intVar: Int 传递给需要 Double 绑定的函数。

(这个上下文是我有一个 Int,我想将其传递给 SwiftUI 中的 Slider。)

binding casting slider swift swiftui

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

当我按下回车键或在文本字段外单击时,如何移除文本字段焦点?(SwiftUI,MacOS)

当我按下回车键或在文本字段外单击时,如何移除文本字段焦点?请注意,这是MacOS上的 SwiftUI 。

如果我这样做:

import SwiftUI

struct ContentView: View {
  @State var field1: String = "This is the Text Field View"

  var body: some View {
    VStack{
      Button("Press") {
        print("Button Pressed")
      }

      TextField("Fill in Text", text: Binding(
        get: { print("get") ; return self.field1 },
        set: { print("set") ; self.field1 = $0 }
        )
      )
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

然后单击 TextField 并对其进行编辑,然后单击 TextField 不会失去焦点的按钮。如何让它退出编辑模式并失去焦点。

如果我按 Return,我也想从 TextField 失去焦点。我将绑定初始化程序与 get 和 set 一起使用,因为我认为我可以以某种方式拦截按键并检测“返回”字符,但这不起作用。

任何帮助表示赞赏:-)

focus keypress textfield swiftui

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

如何检测何时点击 TextField?(MacOS 上的 SwiftUI)

如何检测何时点击 TextField?(MacOS 上的 SwiftUI)

import SwiftUI

struct ContentView: View {
  @State var field: String = "TextField"
  
  var body: some View {
    TextField("Fill in Text", text: $field)
      .onTapGesture {
        print("Textfield pressed")
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

当 TextField 被点击时,它不会打印“Textfield press”。我猜这是因为在 TextField 手势检测到点击之前,TextField 已经拾取了它。

touch textfield gesture swift swiftui

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

以可复制的方式创建随机数并隐藏生成器线程(使用Haskell Monad)

我需要在Haskell中创建随机数据。我希望我的代码是:a)从种子可复制b)生成器的线程是隐式的

我大致了解Monad以及随机发生器的工作方式。我的方法是通过代码对生成器进行线程处理,以便可以重现随机数,但希望将生成器的线程隐藏在Monad中。我认为State Monad是个好方法。

这是一些简单的代码:

type Gen a = State StdGen a

roll :: Gen Int
roll = state $ randomR (1, 6)

roll2 :: Gen Int
roll2 = (+) <$> roll <*> roll

test :: Int -> IO ()
test seed = do
  let gen = mkStdGen seed
  print (evalState roll gen)
  print (evalState roll gen)
  print (evalState roll2 gen)
  print (evalState roll2 gen)
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用State以便将生成器的线程推入State Monad中,但是roll的结果相同,而roll2的结果相同。我可以看到这是因为我多次将gen传递给函数,因此当然会产生相同的输出。因此,我认为我需要从每个函数中获取一个新的生成器。但是,我又回到了必须通过代码使生成器线程化的问题,而这正是我试图通过使用State来避免的代码。我觉得我想念一个把戏!

我也探索了MonadRandom,这确实使线程脱离了我的代码,但是我看不到如何使这种方法可重现。

我已经狩猎了很多,尝试了很多事情,但似乎总是能够隐藏生成器,或者使代码可重现,但不能同时重现。

我热衷于使用比IO更具体的Monad。

我还将构建一系列更复杂的函数,这些函数将生成数字的随机列表,因此我需要一种简单的方法来使这些随机函数相互依赖。我用MonadRandom做到了这一点,但是我再也看不到它是如何可再现的。

任何帮助表示赞赏。

random monads haskell

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