小编Kel*_*Lau的帖子

间接的枚举和结构

首先,我想说,我知道在SO中有很多文章和问题引用了indirectSwift中的关键字.

最常用的解释indirect是允许递归枚举.

indirect我想知道它是如何允许我们使用递归枚举的,而不是只知道允许我们做什么.

问题:

是因为枚举是值类型,如果它们是以递归结构构建的,那么值类型不能很好地扩展?为什么?

indirect修改值类型行为是否更像行为类型?

以下两个例子编译得很好.有什么不同?

indirect enum BinaryTree<T> {
  case node(BinaryTree<T>, T, BinaryTree<T>)
  case empty
}

enum BinaryTree<T> {
  indirect case node(BinaryTree<T>, T, BinaryTree<T>)
  case empty
}
Run Code Online (Sandbox Code Playgroud)

enums struct swift

45
推荐指数
1
解决办法
8938
查看次数

@NSManaged做什么?

我在各种场合遇到过这个关键字.我知道它应该做什么.但我真的想要更好地理解它.

我注意到的@NSManaged- 不是基于文档,而是通过重复使用:

  1. 它神奇地取代了键值编码.
  2. 它大致相当于@dynamicObjective-C(我不太了解)
  3. 我需要它继承PFObjectParse SDK.它通常使用KVC从后端读取/写入值.
  4. @NSManaged如果我没有在初始化程序中初始化,那么为任何变量添加前缀将关闭编译器.

正式定义(在核心数据Apple Docs中):

Core Data提供NSManagedObject类的子类中的属性的底层存储和实现.在托管对象子类中的每个属性定义之前添加@NSManaged属性,该属性对应于Core Data模型中的属性或关系.与Objective-C中的@dynamic属性一样,@ NSManaged属性通知Swift编译器将在运行时提供属性的存储和实现.但是,与@dynamic不同,@ NSManaged属性仅适用于Core Data支持.

我从那得到了什么:

使用变量@NSManaged应是从编译时检查豁免的东西.

我已经阅读了关于此事的正式文件和其他各种SO问题:

@synthesize vs @dynamic,有什么区别?

@dynamic使用的常见情况是什么?

我本能地认识到我应该使用它的一些场景.我部分知道它的作用.但我所追求的是对它的作用的更纯粹的理解.

进一步观察:

一个PFObjectParse SDK依赖于Key Value Coding访问它的值.本PFObject提供了以下存取:

objectForKey:

let score = results.objectForKey("descriptionOfResult") 
//returns the descriptionOfResult value from the results object
Run Code Online (Sandbox Code Playgroud)

setObject:forKey:

results.setObject("The results for a physics exam", forKey: "descriptionOfResult") 
//sets the value of …
Run Code Online (Sandbox Code Playgroud)

cocoa-touch objective-c ios parse-platform swift

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

OptionSetType和枚举

我有一个名为ProgrammingLanguage:

enum ProgrammingLanguage {
  case Swift, Haskell, Scala
}
Run Code Online (Sandbox Code Playgroud)

现在我有一个名为Programmer以下属性的类:

let favouriteLanguages: ProgrammingLanguage = .Swift
Run Code Online (Sandbox Code Playgroud)

看到程序员如何拥有几种最喜欢的语言,我认为写这样的东西会很好:

let favouriteLanguages: ProgrammingLanguage = [.Swift, .Haskell]
Run Code Online (Sandbox Code Playgroud)

经过一些研究,我意识到我需要遵守OptionSetType,但在这样做时,我提出了以下3个错误:

ProgrammingLanguage不符合

  1. SetAlgebraType
  2. OptionSetType
  3. RawRepresentable

当我看到Raw Representable错误时,我立即想到了枚举的关联类型.我希望能够打印枚举值,所以我将我的枚举签名更改为以下内容:

case ProgrammingLanguage: String, OptionSetType {
  case Swift, Haskell, Scala
}
Run Code Online (Sandbox Code Playgroud)

这使警告中的两个沉默了.但是我仍然留下了一个我不符合协议的东西SetAlgebraType.

经过一些试验和错误后,我发现枚举的相关类型是Int固定的(这是有道理的,因为RawRepresentable协议要求你实现签名的初始化程序init(rawValue: Int)).但是,我对此并不满意; 我希望能够轻松获得枚举的字符串表示形式.

有人可以告诉我如何轻松地做到这一点,为什么OptionSetType需要一个Int相关的类型?

编辑:

以下声明正确编译,但运行时出错:

enum ProgrammingLanguage: Int, OptionSetType {
  case Swift, Scala, Haskell
}

extension ProgrammingLanguage {
  init(rawValue: …
Run Code Online (Sandbox Code Playgroud)

enums swift optionsettype

14
推荐指数
2
解决办法
6143
查看次数

在终端中运行Swift构建导致"平台路径"错误

我最近重新格式化了我的Mac.今天我尝试通过Terminal构建一个swift可执行文件来启动服务器端swift项目.这是我用过的命令:

  1. swift包init --type可执行文件

  2. 快速构建

运行时swift build,我收到以下错误:

xcrun: error: unable to lookup item 'PlatformPath' from command line tools installation
xcrun: error: unable to lookup item 'PlatformPath' in SDK '/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk'
Run Code Online (Sandbox Code Playgroud)

我正在运行Xcode 8.3.1.

提前致谢!

xcode swift

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

Swift中的"是"关键字

据我所知,似乎共识是isSwift关键字是isKindOfClass方法的同义词.

但是,我无法让以下工作:

//inside of a method in UITabViewController

//check if the currently selected tab is ActivityViewController
if selectedViewController is ActivityViewController {
    print("isActivity")
} else {
    print("isNotActivity")
}


//same check
if selectedViewController?.isKindOfClass(ActivityViewController) != nil {
    print("isActivity")
} else {
    print("isNotActivity)
}
Run Code Online (Sandbox Code Playgroud)

当调用这段代码时,我确保我在我的ActivityViewController标签中.isKindOfClass是对的,selectedViewController is ActivityViewController不是.有什么想法为什么?

ios swift

7
推荐指数
1
解决办法
5162
查看次数

解决 UIStackView 布局二义性

我有一个UITableViewCell包含以下元素的自定义:

  • 用户界面图像视图
  • 用户界面标签
  • 用户界面标签

我想要UIImageView左边的,两个UILabel对象一个叠放在右边的另一个上。这是故事板中的样子:

堆栈视图

我有一个水平的 UIStackView。里面是UIImageView和 一个垂直的 UIStackView

下面是层次结构的样子:

等级制度

出于某种原因,我收到了关于标题和描述标签不明确的警告。我试图一次又一次地调整它们,但我无法完全正确。任何建议表示赞赏。

ios uistackview

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

自动调整UICollectionView标头的大小

我正在尝试为待办事项列表类型的应用制作详细屏幕。这是详细信息屏幕当前的外观:

详细画面

这是UICollectionViewController带有标题的。标头包含2个UILabel对象和1个UITextView对象。这些对象的布局由垂直管理UIStackView。A UIView用于设置白色背景。

我在定义UICollectionReusableView运行时的高度时遇到一些困难。任何建议表示赞赏。

ios uicollectionview uicollectionreusableview swift

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

使Button跨VStack

我目前有以下SwiftUI视图:

HStack {
  ...
  VStack {
    TextField { ... }
    SecureField { ... }
    Button { ... }
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

我添加了一个.background(Color.green)Button,并且你可以看到,该视图非常贴身的文字。

我想知道是否有一种方法可以调整按钮的宽度,以使其填充到整个按钮VStack-类似于的.fill模式UIStackView

swift swiftui

6
推荐指数
5
解决办法
1692
查看次数

故事板!与 UIStoryboard(名称:“Main”,包:nil)

我进入了一个具有以下声明的项目:

UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("asdf") as! AsdfViewController
Run Code Online (Sandbox Code Playgroud)

我一直都是storyboard!这样做的。这是我的理解,storyboard!将永远给我UIStoryboard(name: "Main", bundle: nil)。这是一个危险的假设吗?

我知道UIStoryboard如果您想引用不同的故事板文件,您可能想使用官方构造函数,但是storyboard!如果您确定要实例化的 VC 是其中的一部分,将其缩写为安全Main.storyboard吗?

ios swift

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

无法访问 Swift 包 xcassets

我正在尝试使用xcassetsSwift 包 ( src ) 内文件夹中的颜色集。它似乎不起作用。我通过编写一个尝试使用颜色的简单视图来测试这一点:

Text("Hello")
  .foregroundColor(Color("brandPrimary")
Run Code Online (Sandbox Code Playgroud)

我从这段代码中得到了一个空视图;文本找不到颜色。

我围绕网络进行了大量研究 - 回顾 WWDC 视频,例如Swift 包:资源和本地化,他们似乎建议该xcassets文件夹自动包含为资源。这对我不起作用。

我尝试process("Resources/Colors.xcassets")在我的包清单中添加,但这也没有帮助。

swift swift-package-manager swift-package

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