它以空字符串而不是nil开头.即使它明确地设置为nil,它仍然是一个空字符串.我不明白.也许通过分配nil来轻松清除?用它编写代码很笨重.
var textField = UITextField()
print(textField.text) // prints "Optional("")"
textField.text = nil
print(textField.text) // prints "Optional("")"
Run Code Online (Sandbox Code Playgroud) 我在一个目录中有一个现有的工作区文件,其子目录包含Xcode项目文件.当我从工作区文件的目录发出'pod install'命令(我的pod版本是1.2.0)时,我收到以下警告:
[!] The Podfile contains framework targets, for which the Podfile does not contain host targets (targets which embed the framework).
If this project is for doing framework development, you can ignore this message. Otherwise, add a target to the Podfile that embeds these frameworks to make this message go away (e.g. a test target).
我的pod文件的一般形式是:
workspace 'MyWorkspace'
use_frameworks!
target 'MyFramework' do
pod 'PodA'
project 'MyFramework/MyFramework'
end
target 'MyApplication' do
pod 'PodA'
project 'MyApplication/MyApplication'
end
Run Code Online (Sandbox Code Playgroud)
上面的pod文件适合我.但是请注意,我必须为框架(确实需要它)和应用程序(通过它依赖于框架间接地需要它)表达PodA依赖性.我怀疑如果我只知道如何做警告促使我做的事情 - 即在pod文件中表达应用程序对框架的依赖性,那就没有必要这样做.我在CocoaPods.org上搜索,试验和阅读.一切都无济于事.目标嵌入似乎用于范围pod依赖项 - …
弱和无主引用用于防止在两个对象各自保持对另一个的引用的情况下的保留周期.我得到弱者的使用,但我没有得到无主的使用.以下是Apple的示例,其中两个对象之一应使用无主参考:
class Customer {
let name: String
var card: CreditCard?
init(name: String) { self.name = name }
}
class CreditCard {
let number: UInt64
unowned let customer: Customer
init(number: UInt64, customer: Customer) {
self.number = number
self.customer = customer
}
}
Run Code Online (Sandbox Code Playgroud)
这个想法是没有客户就不能存在信用卡.因此,信用卡可以省去使用弱引用所需的可选展开,并且可以使用无主参考.嗯...那么为什么不使用强大的参考?如果对客户的所有其他引用都消失了(这不应该发生?)那么信用卡使用自己的引用会导致崩溃; 而使用强引用会导致内存泄漏.咦?两种邪恶之间的选择?更好地崩溃,因为在开发和测试期间更容易被注意到?
请帮忙解决一下.谢谢.
我决定通过编写一些简单的代码来更好地理解类型擦除.我有一个通用的士兵协议.士兵有武器,士兵可以战斗.我想创建不同类型士兵的军队.我认为类型擦除会为我提供一种拳击士兵采用者的方法,以便我可以将它们视为普通士兵(而不是狙击手,步兵等)但我发现中间,拳击类型(类型橡皮擦)必须在士兵的相关类型(即武器)上仍然是通用的.所以,我可以让步枪挥舞士兵,或者火箭挥舞士兵而不仅仅是普通的士兵.有没有关于我错过的类型擦除的使用?
import Foundation
// Soldiers have weapons and soldiers can fight
protocol Weapon {
func fire()
}
protocol Soldier {
associatedtype W: Weapon
var weapon: W { get }
func fight()
}
extension Soldier {
func fight() { weapon.fire() }
}
// Here are some weapons
struct Rifle : Weapon {
func fire() { print("Bullets away!") }
}
struct Rocket : Weapon {
func fire() { print("Rockets away!") }
}
struct GrenadeLauncher : Weapon {
func fire() { print("Grernades away!") …Run Code Online (Sandbox Code Playgroud) 我试图了解DispatchQueue的初始化程序的qos和目标参数.我已经看到了关于目标的这些未被接受的答案,但我怀疑他们完全正确.
我将重复Apple 文档中的摘录(我假设目标的含义在Swift 3中没有改变):
" 调度队列的优先级继承自其目标队列.使用dispatch_get_global_queue函数获取所需优先级的合适目标队列.如果将块提交到串行队列,并且串行队列的目标队列是不同的串行队列,则不会与提交到目标队列的块或具有相同目标队列的任何其他队列同时调用块. "
关于第一个,两个句子:如果优先级是从目标队列继承的,那么DispatchQueue初始化程序的qos参数会产生什么影响?
关于第三个(fricking doozy of a)句子:如果我想用目标队列中的提交序列化我的代码的执行,那么为什么不首先将我的工作提交到目标队列?也许这样我就不必进入后排了?
感谢您理解这一点的任何和所有帮助.
我正在使用Swift Package Manager.我有一个项目,我可以通过"快速构建"成功构建.我通过"swift package generate-xcodeproj"创建了一个Xcode项目.当我在Xcode中打开项目时,它成功构建.
Xcode项目包括两个模块A和B.
模块A具有以下映射:
module ModuleA {
umbrella header "/Users/Robert/Temp/MyProject/Sources/ModuleA/include/ModuleA.h"
link "ModuleA"
export *
}
Run Code Online (Sandbox Code Playgroud)
模块B依赖于A并具有以下导入:
import ModuleA
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好; 一切都成功建立.现在我想更改模块映射,以便它使用相对路径,例如:
module ModuleA {
umbrella header "ModuleA.h"
link "ModuleA"
export *
}
Run Code Online (Sandbox Code Playgroud)
但是,当我这样做时,我无法构建模块B:错误 - 未找到伞标题"ModuleA.h".我在Build Settings - > Search Paths - > Header Search Paths和User Header Search Paths中尝试了我能想到的一切.我在网上,这里和其他地方发现了类似的问题,并尝试过我读过的内容,但到目前为止还没有.
这已达到拔毛阶段.任何建议将不胜感激!
我已经在项目中添加了gpx文件;它的名称是TrailOfHistory.gpx。我已经编辑了项目的方案,以便Xcode 9使用此文件执行位置更新。
以下是方案的“运行”和“测试”配置的屏幕截图,其中我指定了应使用gpx文件:
当我运行应用程序时,用户位置更新(如gpx文件所给出的)会自动开始。我可以在应用程序的MKMapView上看到这种情况。
相反,当我运行我的单元测试之一时,用户位置更新不会自动开始。相反,我必须执行手动步骤,单击调试工具栏的“模拟位置”按钮并选择gpx文件。如以下屏幕截图所示:
我的最终目标是得出一组可以由连续集成系统执行的测试。因此,单击Xcode按钮不会成功。
谁能提供这方面的见识?特别是,谁能说出他/她曾经创建过XCTest的经验,其中自动开始了位置更新(如果这样的话,我会怀着希望;目前我不清楚我应该有什么期望)?
注意:一年多以前,我发现了这个非常相似的问题。希望我能引起一些新的兴趣。
func function1(arg: Int) -> Int { return arg }
func function2<T>(arg: T) -> T { return arg }
let f1 = function1 // No problem
let f2 = function2<Int> // Cannot explicitly specialize a generic function
Run Code Online (Sandbox Code Playgroud)
目前语言的短缺?
请考虑以下声明:
DispatchQueue.global(qos: .userInitiated).asyncAfter(deadline: .now() + .milliseconds(500), qos: .utility, flags: .noQoS) {
print("What is my QOS?")
}
Run Code Online (Sandbox Code Playgroud)
请注意有多少参数涉及服务质量。仅仅一个凡人的可能性怎么能解决这些排列呢?
我正在定义lldb用户变量,如下所示(lldb没有报告错误):
(lldb) expression -l swift -- let $servicesButton = unsafeBitCast(0x127979670, to: UIButton.self)
Run Code Online (Sandbox Code Playgroud)
当我尝试使用变量时,我得到:
(lldb) po $servicesButton
error: use of undeclared identifier '$servicesButton'
(lldb) po $servicesButton.isEnabled
error: use of undeclared identifier '$servicesButton'
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
顺便说一句:万一这很重要,我通过单击“调试视图层次结构”按钮闯入了调试器。然后,我打印了UIButton的描述,并在上面的unsafeBitCast中使用了显示的内存地址。
更新:我正在使用Xcode10。这是另一个lldb命令系列,用于说明我的问题:
(lldb) expression var $temp = 5
error: unknown type name 'var'
(lldb) expression -l swift -- var $temp = 5
(lldb) po $temp
error: use of undeclared identifier '$temp'
(lldb) expression int $xxx = 5
(lldb) po $xxx
5
Run Code Online (Sandbox Code Playgroud)
更新2:我似乎要到某个地方:
(lldb) settings set target.language swift
(lldb) …Run Code Online (Sandbox Code Playgroud) 我正在使用Eclipse Oxygen 3.在配置JavaServer Faces方面时,可以选择的最高版本号是2.2.告诉Eclipse我使用2.3版的正确方法是什么?
我已经为iphoneos和iphonesimulator构建了我的项目,包括调试和发布。当我在调试版本上运行dwarfdump时,报告为空。当我在发行版DSYM上运行它时,它将报告所有符号。
请参见下面的输出(我仅抓取了DSYM输出的第一部分)。
为什么调试版本为空?
.debug_info内容:<EMPTY>
.debug_info内容:<EMPTY>
.debug_info内容:
0x00000000:编译单元:长度= 0x000013ad版本= 0x0003 abbr_offset = 0x00000000 addr_size = 0x04(下一个CU位于0x000013b1)
0x0000000b:TAG_compile_unit [1] * AT_producer(“ Apple Swift版本3.0.2(swiftlang-800.0.63 clang-800.0.42.1)”)AT_language(DW_LANG_Swift)AT_name(“ / Users / Robert / Development / iOS / VerticonsToolbox / VerticonsToolbox / UI / Application.swift“)AT_stmt_list(0x00000000)AT_comp_dir(” / Users / Robert / Development / iOS / VerticonsToolbox“)
请看一下以下方法,我使用该方法将子图层沿 y 轴向上移动 50 点。特别要注意最后一行(已被注释掉)。
@objc func animateButtonPressed(_ sender: UIButton) {
let initialValue = customView.sublayer.position.y
let finalValue = customView.sublayer.position.y - 50
let animation = CABasicAnimation(keyPath: "position.y")
animation.fromValue = initialValue
animation.toValue = finalValue
animation.duration = 2
customView.sublayer.add(animation, forKey: "Reposition")
//customView.sublayer.position.y = finalValue
}
Run Code Online (Sandbox Code Playgroud)
使用所示的代码,我得到以下行为:
我读到的所有内容都告诉我,发生“跳回”是因为我没有更新模型以反映最终值。因此,让我们通过取消最后一行的注释来更新模型。现在的行为是:
跳跃显然正在发生,因为最终位置正在模型上设置。我觉得我陷入了第 22 条陷阱。任何帮助将不胜感激。
可以在GitHub上找到说明该问题的工作项目
Xcode 10.0、iOS 12.2、斯威夫特 4.2