我需要检查我的视图框架是否等于给定的CGRect.我尝试这样做:
CGRect rect = CGRectMake(20, 20, 20, 20);
if (self.view.frame == rect)
{
// do some stuff
}
Run Code Online (Sandbox Code Playgroud)
但是,我说错了Invalid operands to binary expression('CGRect' (aka 'struct CGRect') and 'CGRect').为什么我不能简单地比较两个CGRect?
struct MyStruct {
var count = 0
mutating func add(amount: Int) {
count += amount
}
}
var myStruct = MyStruct()
[1, 2, 3, 4].forEach(myStruct.add)
// Partial application of 'mutating' method is not allowed
Run Code Online (Sandbox Code Playgroud)
为什么不使用forEach这样允许变异方法?我知道我能做到
for number in [1, 2, 3, 4] {
myStruct.add(number)
}
Run Code Online (Sandbox Code Playgroud)
要么
[1, 2, 3, 4].forEach { myStruct.add($0) }
Run Code Online (Sandbox Code Playgroud)
相反,但都没有那么干净
[1, 2, 3, 4].forEach(myStruct.add)
Run Code Online (Sandbox Code Playgroud) 我的代码中包含以下代码main.swift:
let strategist = GKMinmaxStrategist()
strategist.gameModel = position
strategist.maxLookAheadDepth = 1
strategist.randomSource = nil
let move = strategist.bestMoveForActivePlayer()
Run Code Online (Sandbox Code Playgroud)
... position我的GKGameModel子类的实例在哪里Position.运行此代码后,move是nil.bestMoveForPlayer(position.activePlayer!)也导致nil(但position.activePlayer!导致一个Player对象).
然而,
let moves = position.gameModelUpdatesForPlayer(position.activePlayer!)!
Run Code Online (Sandbox Code Playgroud)
导致非空的可能移动数组.从Apple的文档(关于bestMoveForPlayer(_:)):
如果玩家无效,玩家不是游戏模型的一部分,或玩家没有有效的移动,则返回nil.
据我所知,这种情况都不是这样,但功能仍然存在nil.这可能会发生什么?
如果它可以有任何帮助,这是我的GKGameModel协议的实现:
var players: [GKGameModelPlayer]? = [Player.whitePlayer, Player.blackPlayer]
var activePlayer: GKGameModelPlayer? {
return playerToMove
}
func setGameModel(gameModel: GKGameModel) {
let position = gameModel as! Position
pieces = position.pieces …Run Code Online (Sandbox Code Playgroud) 我今天再次尝试尝试理解Swift中的保留周期和弱引用.通过阅读文档,我看到了以下代码示例,其中一个引用变量被标记为weak阻止保留周期:
class Person {
let name: String
init(name: String) { self.name = name }
var apartment: Apartment?
deinit { print("\(name) is being deinitialized") }
}
class Apartment {
let unit: String
init(unit: String) { self.unit = unit }
weak var tenant: Person? // <---- This var is marked as 'weak'
deinit { print("Apartment \(unit) is being deinitialized") }
}
var john: Person?
var unit4A: Apartment?
john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
john!.apartment = …Run Code Online (Sandbox Code Playgroud) 我今天开始使用Objective-C块.我写了以下代码:
NSArray *array = @[@25, @"abc", @7.2];
void (^print)(NSUInteger index) = ^(NSUInteger index)
{
NSLog(@"%@", array[index]);
};
for (int n = 0; n < 3; n++)
print(n);
Run Code Online (Sandbox Code Playgroud)
哪个工作正常.我需要array在声明后更改变量,所以我尝试使用以下代码:
NSArray *array;
void (^print)(NSUInteger index) = ^(NSUInteger index)
{
NSLog(@"%@", array[index]);
};
array = @[@25, @"abc", @7.2];
for (int n = 0; n < 3; n++)
print(n);
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用.控制台只打印(null)三次.为什么这不起作用,而它确实与我的第一段代码一起工作?
假设我有一个像这样的结构:
struct MyStruct: CustomStringConvertible {
let myInt: Int
let myString: String
var description: String {
return "my int is \(myInt),\nand my string is \"\(myString)\""
}
}
Run Code Online (Sandbox Code Playgroud)
从代码打印描述工作正常.
let myStruct = MyStruct(myInt: 3, myString: "hello")
print(myStruct)
Run Code Online (Sandbox Code Playgroud)
这导致了
my int is 3,
and my string is "hello"
Run Code Online (Sandbox Code Playgroud)
当我想myStruct从调试器打印描述时出现问题.po myStruct结果是
? my int is 3,
and my string is "hello"
- myInt : 3
- myString : "hello"
Run Code Online (Sandbox Code Playgroud)
明确地打印出它的描述也没有任何帮助,因为po myStruct.description结果
"my int is 3,\nand my string is …Run Code Online (Sandbox Code Playgroud) 来自Apple的MutableCollectionAPI参考:
该
MutableCollection协议允许更改集合元素的值,但不能更改集合本身的长度.对于需要添加或删除元素的操作,请参阅RangeReplaceableCollection协议.
但是,MutableCollection需要以下下标:
subscript(bounds: Range<Self.Index>) -> Self.SubSequence { get set }
Run Code Online (Sandbox Code Playgroud)
这是否允许更改集合的长度?例如,我们不能用空范围和非空子序列来调用这个下标的setter吗?
你好,我有这样的约会
2016-02-10 00:00:00
Run Code Online (Sandbox Code Playgroud)
我想以这种方式得到它的日期
14.05.2016 or 14-05-2016
Run Code Online (Sandbox Code Playgroud)
这就是我尝试过的
let dateFormatter = NSDateFormatter()
let date = "2016-02-10 00:00:00"
dateFormatter.dateFormat = "dd-MM-yyyy"
let newdate = dateFormatter.dateFromString(date)
print(newdate) //nil is coming
Run Code Online (Sandbox Code Playgroud) 苹果今年比以往任何时候都更容易在执行拖动手势后平滑地制作视图动画,自动使用拖动手势的最终速度作为动画的初始速度。这是一个简单的例子:
struct DraggableCircle: View {
@State private var offset: CGSize = .zero
var body: some View {
let gesture = DragGesture(minimumDistance: 0)
.onChanged { gesture in
offset = gesture.translation
}
.onEnded { _ in
withAnimation(.bouncy(duration: 2)) {
offset = .zero
}
}
Circle()
.frame(width: 200, height: 200)
.offset(offset)
.gesture(gesture)
}
}
Run Code Online (Sandbox Code Playgroud)
但是,此代码缺乏的是通过在动画完成之前启动新的拖动手势来平滑中断圆圈动画的能力。相反,圆圈将立即完成动画,跳离您的手指:
这是完全有道理的,因为我们要回到offset手势.zero结束时,而没有做任何事情来找出当动画中断时圆圈在屏幕上的位置。
使这项工作没有任何突然跳跃的最直接的方法是什么?
一种可能的方法是使用手势的位置而不是其平移来定位圆圈,这总是将圆圈放置在手势发生的位置:
struct DraggableCircle_v2: View {
@State private var position: CGPoint?
var body: some View {
let gesture = DragGesture(minimumDistance: 0) …Run Code Online (Sandbox Code Playgroud) swift ×8
ios ×2
objective-c ×2
cgrect ×1
cocoa-touch ×1
comparison ×1
gameplay-kit ×1
ios17 ×1
nsdate ×1
optional ×1
swift3 ×1
swiftui ×1
variables ×1
xcode ×1