首先,我想说,我知道在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) 我在各种场合遇到过这个关键字.我知道它应该做什么.但我真的想要更好地理解它.
我注意到的@NSManaged- 不是基于文档,而是通过重复使用:
@dynamicObjective-C(我不太了解)PFObject从Parse SDK.它通常使用KVC从后端读取/写入值.@NSManaged如果我没有在初始化程序中初始化,那么为任何变量添加前缀将关闭编译器.正式定义(在核心数据Apple Docs中):
Core Data提供NSManagedObject类的子类中的属性的底层存储和实现.在托管对象子类中的每个属性定义之前添加@NSManaged属性,该属性对应于Core Data模型中的属性或关系.与Objective-C中的@dynamic属性一样,@ NSManaged属性通知Swift编译器将在运行时提供属性的存储和实现.但是,与@dynamic不同,@ NSManaged属性仅适用于Core Data支持.
我从那得到了什么:
使用变量
@NSManaged应是从编译时检查豁免的东西.
我已经阅读了关于此事的正式文件和其他各种SO问题:
@synthesize vs @dynamic,有什么区别?
我本能地认识到我应该使用它的一些场景.我部分知道它的作用.但我所追求的是对它的作用的更纯粹的理解.
进一步观察:
一个PFObject在Parse 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) 我有一个名为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不符合
SetAlgebraType OptionSetType 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) 我最近重新格式化了我的Mac.今天我尝试通过Terminal构建一个swift可执行文件来启动服务器端swift项目.这是我用过的命令:
swift包init --type可执行文件
快速构建
运行时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.
提前致谢!
据我所知,似乎共识是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不是.有什么想法为什么?
我有一个UITableViewCell包含以下元素的自定义:
我想要UIImageView左边的,两个UILabel对象一个叠放在右边的另一个上。这是故事板中的样子:
我有一个水平的 UIStackView。里面是UIImageView和 一个垂直的 UIStackView。
下面是层次结构的样子:
出于某种原因,我收到了关于标题和描述标签不明确的警告。我试图一次又一次地调整它们,但我无法完全正确。任何建议表示赞赏。
我正在尝试为待办事项列表类型的应用制作详细屏幕。这是详细信息屏幕当前的外观:
这是UICollectionViewController带有标题的。标头包含2个UILabel对象和1个UITextView对象。这些对象的布局由垂直管理UIStackView。A UIView用于设置白色背景。
我在定义UICollectionReusableView运行时的高度时遇到一些困难。任何建议表示赞赏。
我目前有以下SwiftUI视图:
HStack {
...
VStack {
TextField { ... }
SecureField { ... }
Button { ... }
}
...
}
Run Code Online (Sandbox Code Playgroud)
我添加了一个.background(Color.green)到Button,并且你可以看到,该视图非常贴身的文字。
我想知道是否有一种方法可以调整按钮的宽度,以使其填充到整个按钮VStack-类似于的.fill模式UIStackView。
我进入了一个具有以下声明的项目:
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吗?
我正在尝试使用xcassetsSwift 包 ( src ) 内文件夹中的颜色集。它似乎不起作用。我通过编写一个尝试使用颜色的简单视图来测试这一点:
Text("Hello")
.foregroundColor(Color("brandPrimary")
Run Code Online (Sandbox Code Playgroud)
我从这段代码中得到了一个空视图;文本找不到颜色。
我围绕网络进行了大量研究 - 回顾 WWDC 视频,例如Swift 包:资源和本地化,他们似乎建议该xcassets文件夹自动包含为资源。这对我不起作用。
我尝试process("Resources/Colors.xcassets")在我的包清单中添加,但这也没有帮助。
swift ×9
ios ×5
enums ×2
cocoa-touch ×1
objective-c ×1
struct ×1
swiftui ×1
uistackview ×1
xcode ×1