我在 MACOS 上使用 SwiftUI
如果我这样做:
Button(action: { } ) {
Text("Press")
.padding()
.background(Color.blue)
}
Run Code Online (Sandbox Code Playgroud)
我明白了:
两个灰色区域是可点击按钮的末端。但我希望按钮是蓝色区域的形状。任何想法如何让整个蓝色区域都可以点击。
(我确实考虑过使用 .onTapGesture 但这不会使按钮动画化,因此您知道您已经点击了它。)
我知道通常我无法实例化协议。但是如果我在协议中包含一个初始化程序,那么编译器肯定知道当协议稍后被结构或类使用时,它会有一个可以使用的 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) 我有一份动物名单:
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) 很快我就可以用 Int(doubleVariable) 将 Int 转换为 Double 。
但是如何将 Binding <Double> 转换为 Binding<Int> 呢?
然后我可以将 @Binding var intVar: Int 传递给需要 Double 绑定的函数。
(这个上下文是我有一个 Int,我想将其传递给 SwiftUI 中的 Slider。)
当我按下回车键或在文本字段外单击时,如何移除文本字段焦点?请注意,这是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 一起使用,因为我认为我可以以某种方式拦截按键并检测“返回”字符,但这不起作用。
任何帮助表示赞赏:-)
如何检测何时点击 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 已经拾取了它。
我需要在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做到了这一点,但是我再也看不到它是如何可再现的。
任何帮助表示赞赏。