小编Tim*_*len的帖子

Swift中的可选值是什么?

来自Apple的文档:

您可以使用iflet一起处理可能缺少的值.这些值表示为选项.可选值包含值或包含nil以指示缺少值.?在值的类型后面写一个问号()以将值标记为可选.

为什么要使用可选值?

optional swift

258
推荐指数
6
解决办法
13万
查看次数

比较两个CGRects

我需要检查我的视图框架是否等于给定的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

comparison cocoa-touch objective-c ios cgrect

95
推荐指数
3
解决办法
3万
查看次数

不允许部分应用"变异"方法

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)

swift

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

GKMinmaxStrategist不会返回任何动作

我的代码中包含以下代码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.运行此代码后,movenil.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 gameplay-kit gkminmaxstrategist

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

两个弱变量在Swift中相互引用?

我今天再次尝试尝试理解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)

weak-references automatic-ref-counting swift

11
推荐指数
2
解决办法
1160
查看次数

Objective-C块和变量

我今天开始使用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)三次.为什么这不起作用,而它确实与我的第一段代码一起工作?

variables objective-c objective-c-blocks

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

如何在调试时打印Swift结构的自定义描述,而不是其他内容?

假设我有一个像这样的结构:

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)

xcode swift

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

MutableCollection与RangeReplaceableCollection

来自Apple的MutableCollectionAPI参考:

MutableCollection协议允许更改集合元素的值,但不能更改集合本身的长度.对于需要添加或删除元素的操作,请参阅RangeReplaceableCollection协议.

但是,MutableCollection需要以下下标:

subscript(bounds: Range<Self.Index>) -> Self.SubSequence { get set }
Run Code Online (Sandbox Code Playgroud)

这是否允许更改集合的长度?例如,我们不能用空范围和非空子序列来调用这个下标的setter吗?

swift swift3

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

从2016-02-10 00:00:00之类的日期删除时间

你好,我有这样的约会

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)

nsdate nsdateformatter ios swift

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

使用拖动手势中断 SwiftUI 动画

苹果今年比以往任何时候都更容易在执行拖动手势后平滑地制作视图动画,自动使用拖动手势的最终速度作为动画的初始速度。这是一个简单的例子:

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 swiftui swiftui-animation ios17

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