小编Hon*_*ney的帖子

Swift vs Objcective-C协议

来自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中看到像这样使用的协议.那他们有什么不同?

protocols objective-c swift

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

如何预选特定文本字段的Caps键?

当我开始键入时,我希望在键盘上预先选择CapsLock,所以我只键入Caps Lock中的所有内容。

keyboard uikeyboard swift

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

什么是占位符?为什么我们需要为泛型定义占位符数据类型?

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>.

generics swift

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

RxSwift-表格视图中的Textfield-Variable绑定

我是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行的值都相同

uitableview ios swift rx-swift rx-cocoa

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

关闭不会在主线程中快速运行

我想在 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)

multithreading ios swift

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

在Objective-C中,导入头文件和实现文件之间有什么区别?

我很新鲜地学习Objective-C。头文件最像公共接口,而实现文件具有私有接口。

但是我对选择在何处导入另一个头文件感到困惑。

import objective-c header-files

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

如何打开/查看设备上存储的 iOS OSLogs?

我正在使用 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)。有plistktx文件。和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(我 …

xcode logging swift oslog

1
推荐指数
2
解决办法
4634
查看次数

从多维数组中删除重复项

我写了以下扩展名来删除我的数组中的重复项.

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 …

arrays value-type swift equatable

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

How to subclass a UIViewController and add properties in swift?

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 …

initialization properties uiviewcontroller ios swift

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

SwiftUI 图表可点击注释

我正在尝试处理 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)

我还尝试了带有操作、图像等的按钮,但似乎注释中的所有交互都被禁用或者我不知道..

苹果提供了一些用于点击句柄的代码,但我不知道如何将其用于字符串(例如苹果有日期)并且没有像我一样的比较栏。

有什么想法吗?

在此输入图像描述

ios swiftui swiftui-charts

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