来自Objective-C背景,其中每个协议必须始终具有委托属性.在Swift中似乎并非如此,它打破了我对协议的范式.
Swift中的AFAIK,协议用于两个主要目的:委托模式(需要像Objective-C这样的委托)以及组合模式(在Objective-C中不存在并且不需要委托属性)与扩展使其比Objective-C中的传统继承模式更有效.
我理解正确吗?你能澄清一下吗?
编辑:
我所看到的不同之处在于:来自Apple的WWDC
传统方式是(Slide76):
class Ordered {
func precedes(other: Ordered) -> Bool { fatalError("implement me!") }
}
class Number : Ordered {
var value: Double = 0
override func precedes(other: Ordered) -> Bool {
return self.value < (other as! Number).value
}
}
Run Code Online (Sandbox Code Playgroud)
新的Swift方式是(幻灯片90):
protocol Ordered {
func precedes(other: Self) -> Bool
}
struct Number : Ordered {
var value: Double = 0
func precedes(other: Number) -> Bool {
return self.value < other.value
}
}
Run Code Online (Sandbox Code Playgroud)
而且我从来没有在Objective-C中看到像这样使用的协议.那他们有什么不同?
当我开始键入时,我希望在键盘上预先选择CapsLock,所以我只键入Caps Lock中的所有内容。
func inspect <SomeType> (value: SomeType) {
print ("Received \(type(of: value)) with the value of \(value)")
}
Run Code Online (Sandbox Code Playgroud)
我正在遵循 Pro Swift 书中的教程,但我不明白为什么我们需要<SomeType>. 看来没有必要。我们向编译器提供了哪些附加信息?
作者本人说:
请注意 SomeType 的使用:其中一个位于函数名称后面的尖括号中,另一个用于描述值参数。尖括号中的第一个是最重要的,因为它定义了占位符数据类型:inspect() 意味着“有一个名为spect() 的函数,可以与任何类型的数据类型一起使用,但无论数据类型是什么我想将其称为 SomeType。” 因此,参数值:SomeType 现在应该更有意义:SomeType 将替换为用于调用函数的任何数据类型。
我不明白也不明白占位符数据类型意味着什么?
编辑:
或者有一个更好的例子
func inspect <T> (value1: T, value2: T) {
// ....
}
Run Code Online (Sandbox Code Playgroud)
我的问题:我知道 T 将强制 value1 和 value2 具有相同的类型,那么<T>.
我是RxSwift的新手,我有以下代码来设置一个包含文本字段的tableview:
budget.expenses.asObservable()
.bindTo(tableView.rx.items(cellIdentifier: ExpenseInputCell.cellIdentifier, cellType: ExpenseInputCell.self)){(row, element, cell) in
cell.name.text = element.name.value
cell.name.rx.text
.bindTo(element.name)
.addDisposableTo(self.disposeBag)
}
.addDisposableTo(disposeBag)
tableView.rx.itemDeleted
.subscribe(onNext: {indexPath in
self.budget.expenses.value.remove(at: indexPath.row)
})
.addDisposableTo(disposeBag)
Run Code Online (Sandbox Code Playgroud)
一切工作正常,直到删除一行,因为然后混合了文本字段与数组中正确对象的绑定。例如,假设我在表视图中有7个项目,并且删除了第5行,新的第5和第6行的值都相同
我想在 UITableViewCell 上显示一些图像。但是我在下面遇到错误
fatal error: Index out of range。问题是闭包可能不会在主线程中运行。我该如何解决这个问题?
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "PickupTableViewCell", for: indexPath) as! PickupTableViewCell
APIManager.getAnotherArticle{ (articles: Array<Article>?) in
for info in articles! {
self.authorArray.append(info.author)
self.descriptionArray.append(info.description)
if info.publishedAt != nil {
self.publishedAtArray.append(info.publishedAt)
}
self.titleArray.append(info.title)
self.urlArray.append(info.url)
self.urlToImageArray.append(info.urlToImage)
print(self.authorArray)
}
}
let program = urlToImageArray[indexPath.row] //index out of range
let urlToImage = NSURL(string: program)
cell.pickupImageView.sd_setImage(with: urlToImage as URL!)
return cell
}
Run Code Online (Sandbox Code Playgroud) 我很新鲜地学习Objective-C。头文件最像公共接口,而实现文件具有私有接口。
但是我对选择在何处导入另一个头文件感到困惑。
我正在使用 Apple 的框架创建日志os.log。我只是制作如下日志:
os_log("Update: Lat: %{public}f | Long: %{private}f | RemainingTime: %{public}f ", log: log, type: .default, location.coordinate.latitude, location.coordinate.longitude, UIApplication.shared.backgroundTimeRemaining).
Run Code Online (Sandbox Code Playgroud)
我确实在控制台和调试器中看到了日志。
我已阅读此内容,并且成功下载了该容器(只是不确定该容器是否包含我要查找的内容,或者这是否是查看的正确位置)。然后我单击“显示包”:
但之后我只看到:
我查看了所有文件。这些文件只包含以下数字:
我应该做一些额外的事情还是我找错了地方?
EDIT1:根据日航的建议:
我调查了(文档、图书馆、tmp)。有plist和ktx文件。和function.data&map.data文件。
我查看了这些文件:
还有这些文件:
我尝试用控制台打开它们,但得到如下图所示的乱码结果:
编辑2:
所以首先我没有权限打开/var/db/diagnostics,我不得不这样做sudo bash。然后我做了cd /var/db/diagnostics并看到了这些文件。
Events
FaultsAndErrors
Oversize
SpecialHandling
StateDumps
TTL
logdata.Persistent.20170724T212501.tracev3
logdata.Persistent.20170725T015616.tracev3
logdata.Persistent.20170725T134017.tracev3
logdata.Persistent.20170725T171020.tracev3
logdata.Persistent.20170725T213354.tracev3
logdata.Persistent.20170726T002702.tracev3
logdata.Persistent.20170726T144412.tracev3
logdata.Persistent.20170726T202128.tracev3
logdata.Persistent.20170727T021506.tracev3
logdata.Persistent.20170727T033929.tracev3
logdata.Persistent.20170727T075325.tracev3
logdata.Persistent.20170727T145233.tracev3
logdata.statistics.0.txt
logdata.statistics.1.txt
shutdown.log
Run Code Online (Sandbox Code Playgroud)
然后我做了open -a console logdata.Persistent.20170725T015616.tracev3(我 …
我写了以下扩展名来删除我的数组中的重复项.
extension Array where Element : Equatable{
func removeDups() -> [Element]{
var result = [Element]()
for element in self{
if !result.contains(element){
result.append(element)
}
}
return result
}
}
Run Code Online (Sandbox Code Playgroud)
线性阵列
let linearArr = [1,2,2,3]
linearArr.removeDups() // [1,2,3] works well!
Run Code Online (Sandbox Code Playgroud)
多维数组
let multiDimArr : [[Int]] = [[1,2,3], [1,2,3], [1,2 ,4]]
multiDimArr.removeDups() // Error!
Run Code Online (Sandbox Code Playgroud)
类型[Int]不符合Equatable
我读到这里.答案说使用阵列比较==应该可行.它不能一直工作:
作品
if (["1", "2"] == ["1", "2"]){
print("true")
}
Run Code Online (Sandbox Code Playgroud)
不行
if ([1, 2] == [1, 2]){ // ERROR!
print("true")
}
Run Code Online (Sandbox Code Playgroud)
运算符'=='的模糊使用
这很特别.我可以比较数组的String …
I want to make a new kind of view controller in Swift that has an additional property that must be explicitly initialized. It doesn't make any sense for this property to be nil or have a default value and the controller will only be initialized programmatically. I tried defining it like this:
class MyController : UIViewController {
var prop: Int
init(prop: Int) {
self.prop = prop
super.init()
}
required init(coder aDecoder: NSCoder?) {
fatalError("don't serialize this")
}
}
Run Code Online (Sandbox Code Playgroud)
I tried …
我正在尝试处理 SwiftUI BarMark 中注释的点击
var body: some View {
List {
Chart {
ForEach(data) {
BarMark(
x: .value("Mount", $0.mount),
y: .value("Value", $0.value)
)
.foregroundStyle(by: .value("Type", "Series \($0.type)"))
.position(by: .value("Type", $0.type))
.annotation {
HStack {
Rectangle()
.fill(Color.red.opacity(0.2))
.frame(width: 20, height: 20)
.clipShape(Circle())
.onTapGesture {
print("Tapped!") // Never called
}
}
}
}
}
.frame(height: 250)
.labelsHidden()
}
}
Run Code Online (Sandbox Code Playgroud)
我还尝试了带有操作、图像等的按钮,但似乎注释中的所有交互都被禁用或者我不知道..
苹果提供了一些用于点击句柄的代码,但我不知道如何将其用于字符串(例如苹果有日期)并且没有像我一样的比较栏。
有什么想法吗?
swift ×8
ios ×4
objective-c ×2
arrays ×1
equatable ×1
generics ×1
header-files ×1
import ×1
keyboard ×1
logging ×1
oslog ×1
properties ×1
protocols ×1
rx-cocoa ×1
rx-swift ×1
swiftui ×1
uikeyboard ×1
uitableview ×1
value-type ×1
xcode ×1